diff options
| author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2020-01-15 15:49:46 (GMT) |
|---|---|---|
| committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2020-01-15 15:49:46 (GMT) |
| commit | 7ed7fa90ffa88ab4144d20e91139e6f36abdf133 (patch) | |
| tree | 6233d2b913eba2a00298d1ede66c3d49a321d5c6 | |
| parent | b8c310c91a436e8514cc19a4fe75c124d5444286 (diff) | |
| parent | a72376335b62d075c3d7d92870af01c361da518e (diff) | |
| download | tcl-7ed7fa90ffa88ab4144d20e91139e6f36abdf133.zip tcl-7ed7fa90ffa88ab4144d20e91139e6f36abdf133.tar.gz tcl-7ed7fa90ffa88ab4144d20e91139e6f36abdf133.tar.bz2 | |
Merge trunk. Fix MSVC static build
151 files changed, 2851 insertions, 2679 deletions
diff --git a/.fossil-settings/binary-glob b/.fossil-settings/binary-glob index 2a205a1..a6eec26 100644 --- a/.fossil-settings/binary-glob +++ b/.fossil-settings/binary-glob @@ -1,4 +1,22 @@ +compat/zlib/win32/zdll.lib +compat/zlib/win32/zlib1.dll +compat/zlib/win64/zdll.lib +compat/zlib/win64/zlib1.dll +compat/zlib/win64/libz.dll.a +compat/zlib/zlib.3.pdf +compat/zlib/win32/zdll.lib +compat/zlib/win32/zlib1.dll +compat/zlib/win64/zdll.lib +compat/zlib/win64/zlib1.dll +compat/zlib/win64/libz.dll.a +compat/zlib/zlib.3.pdf +libtommath/win32/tommath.lib +libtommath/win32/libtommath.dll +libtommath/win64/tommath.lib +libtommath/win64/libtommath.dll +libtommath/win64/libtommath.dll.a *.a +*.bmp *.dll *.exe *.gif diff --git a/.travis.yml b/.travis.yml index 436982b..26ab8de 100644 --- a/.travis.yml +++ b/.travis.yml @@ -101,27 +101,6 @@ matrix: compiler: clang env: - BUILD_DIR=unix - - name: "Linux/Clang/Shared: UTF_MAX=6" - os: linux - dist: xenial - compiler: clang - env: - - BUILD_DIR=unix - - CFGOPT=CFLAGS=-DTCL_UTF_MAX=6 - - name: "Linux/Clang/Shared: UTF_MAX=3" - os: linux - dist: xenial - compiler: clang - env: - - BUILD_DIR=unix - - CFGOPT=CFLAGS=-DTCL_UTF_MAX=3 - - name: "Linux/Clang/Shared:NO_DEPRECATED" - os: linux - dist: xenial - compiler: clang - env: - - BUILD_DIR=unix - - CFGOPT="CFLAGS=-DTCL_NO_DEPRECATED=1" - name: "Linux/Clang/Static" os: linux dist: xenial @@ -137,14 +116,14 @@ matrix: - BUILD_DIR=unix - CFGOPT="--enable-symbols" # Testing on Mac, various styles - - name: "macOS/Xcode 11/Shared/Unix-like" + - name: "macOS/Xcode 11.3/Shared/Unix-like" os: osx - osx_image: xcode11 + osx_image: xcode11.3 env: - BUILD_DIR=unix - - name: "macOS/Xcode 11/Shared" + - name: "macOS/Xcode 11.3/Shared" os: osx - osx_image: xcode11 + osx_image: xcode11.3 env: - BUILD_DIR=macosx install: [] @@ -152,6 +131,10 @@ matrix: - make all # The styles=develop avoids some weird problems on OSX - make test styles=develop + addons: + homebrew: + packages: + - libtommath - name: "macOS/Xcode 10/Shared" os: osx osx_image: xcode10.3 @@ -159,6 +142,10 @@ matrix: - BUILD_DIR=macosx install: [] script: *mactest + addons: + homebrew: + packages: + - libtommath - name: "macOS/Xcode 9/Shared" os: osx osx_image: xcode9 @@ -166,6 +153,10 @@ matrix: - BUILD_DIR=macosx install: [] script: *mactest + addons: + homebrew: + packages: + - libtommath - name: "macOS/Xcode 8/Shared" os: osx osx_image: xcode8 @@ -173,6 +164,10 @@ matrix: - BUILD_DIR=macosx install: [] script: *mactest + addons: + homebrew: + packages: + - libtommath # Test with mingw-w64 cross-compile # Doesn't run tests because wine is only an imperfect Windows emulation - name: "Linux-cross-Windows/GCC/Shared/no test" @@ -251,8 +246,8 @@ matrix: before_install: *vcpreinst install: [] script: - - cmd.exe /C 'vcvarsall.bat x64 && nmake OPTS=static -f makefile.vc all tcltest' - - cmd.exe /C 'vcvarsall.bat x64 && nmake OPTS=static -f makefile.vc test' + - cmd.exe /C 'vcvarsall.bat x64 && nmake OPTS=static,msvcrt -f makefile.vc all tcltest' + - cmd.exe /C 'vcvarsall.bat x64 && nmake OPTS=static,msvcrt -f makefile.vc test' - name: "Windows/MSVC/Debug" os: windows compiler: cl @@ -297,8 +292,8 @@ matrix: before_install: *vcpreinst install: [] script: - - cmd.exe /C 'vcvarsall.bat x86 && nmake OPTS=static -f makefile.vc all tcltest' - - cmd.exe /C 'vcvarsall.bat x86 && nmake OPTS=static -f makefile.vc test' + - cmd.exe /C 'vcvarsall.bat x86 && nmake OPTS=static,msvcrt -f makefile.vc all tcltest' + - cmd.exe /C 'vcvarsall.bat x86 && nmake OPTS=static,msvcrt -f makefile.vc test' - name: "Windows/MSVC-x86/Debug" os: windows compiler: cl @@ -316,7 +311,7 @@ matrix: - BUILD_DIR=win - CFGOPT="--enable-64bit" before_install: &makepreinst - - choco install make + - choco install -y make zip - cd ${BUILD_DIR} - name: "Windows/GCC/Shared: UTF_MAX=6" os: windows @@ -1,6 +1,6 @@ # README: Tcl -This is the **Tcl 9.0a1** source distribution. +This is the **Tcl 9.0a2** source distribution. You can get any source release of Tcl from [our distribution site](https://sourceforge.net/projects/tcl/files/Tcl/). @@ -9024,11 +9024,11 @@ in this changeset (new minor version) rather than bug fixes: 2018-02-14 [TIP 476] Scan/Printf consistency (nijtmans) -2018-03-05 [TIP 351] [lsearch] striding +2018-03-05 [TIP 351] [lsearch] striding 2018-03-05 [TIPs 330,336] tighten access to Interp fields (porter) -2018-03-12 [TIP 462] [::tcl::process] +2018-03-12 [TIP 462] [::tcl::process] 2018-03-12 [TIP 490] add oo support for msgcat => msgcat 1.7.0 (oehlmann) diff --git a/compat/stdint.h b/compat/stdint.h new file mode 100644 index 0000000..88383b0 --- /dev/null +++ b/compat/stdint.h @@ -0,0 +1,919 @@ +/* A portable stdint.h + **************************************************************************** + * BSD License: + **************************************************************************** + * + * Copyright (c) 2005-2016 Paul Hsieh + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + **************************************************************************** + * + * Version 0.1.16.0 + * + * The ANSI C standard committee, for the C99 standard, specified the + * inclusion of a new standard include file called stdint.h. This is + * a very useful and long desired include file which contains several + * very precise definitions for integer scalar types that is critically + * important for making several classes of applications portable + * including cryptography, hashing, variable length integer libraries + * and so on. But for most developers its likely useful just for + * programming sanity. + * + * The problem is that some compiler vendors chose to ignore the C99 + * standard and some older compilers have no opportunity to be updated. + * Because of this situation, simply including stdint.h in your code + * makes it unportable. + * + * So that's what this file is all about. It's an attempt to build a + * single universal include file that works on as many platforms as + * possible to deliver what stdint.h is supposed to. Even compilers + * that already come with stdint.h can use this file instead without + * any loss of functionality. A few things that should be noted about + * this file: + * + * 1) It is not guaranteed to be portable and/or present an identical + * interface on all platforms. The extreme variability of the + * ANSI C standard makes this an impossibility right from the + * very get go. Its really only meant to be useful for the vast + * majority of platforms that possess the capability of + * implementing usefully and precisely defined, standard sized + * integer scalars. Systems which are not intrinsically 2s + * complement may produce invalid constants. + * + * 2) There is an unavoidable use of non-reserved symbols. + * + * 3) Other standard include files are invoked. + * + * 4) This file may come in conflict with future platforms that do + * include stdint.h. The hope is that one or the other can be + * used with no real difference. + * + * 5) In the current version, if your platform can't represent + * int32_t, int16_t and int8_t, it just dumps out with a compiler + * error. + * + * 6) 64 bit integers may or may not be defined. Test for their + * presence with the test: #ifdef INT64_MAX or #ifdef UINT64_MAX. + * Note that this is different from the C99 specification which + * requires the existence of 64 bit support in the compiler. If + * this is not defined for your platform, yet it is capable of + * dealing with 64 bits then it is because this file has not yet + * been extended to cover all of your system's capabilities. + * + * 7) (u)intptr_t may or may not be defined. Test for its presence + * with the test: #ifdef PTRDIFF_MAX. If this is not defined + * for your platform, then it is because this file has not yet + * been extended to cover all of your system's capabilities, not + * because its optional. + * + * 8) The following might not been defined even if your platform is + * capable of defining it: + * + * WCHAR_MIN + * WCHAR_MAX + * (u)int64_t + * PTRDIFF_MIN + * PTRDIFF_MAX + * (u)intptr_t + * + * 9) The following have not been defined: + * + * WINT_MIN + * WINT_MAX + * + * 10) The criteria for defining (u)int_least(*)_t isn't clear, + * except for systems which don't have a type that precisely + * defined 8, 16, or 32 bit types (which this include file does + * not support anyways). Default definitions have been given. + * + * 11) The criteria for defining (u)int_fast(*)_t isn't something I + * would trust to any particular compiler vendor or the ANSI C + * committee. It is well known that "compatible systems" are + * commonly created that have very different performance + * characteristics from the systems they are compatible with, + * especially those whose vendors make both the compiler and the + * system. Default definitions have been given, but its strongly + * recommended that users never use these definitions for any + * reason (they do *NOT* deliver any serious guarantee of + * improved performance -- not in this file, nor any vendor's + * stdint.h). + * + * 12) The following macros: + * + * PRINTF_INTMAX_MODIFIER + * PRINTF_INT64_MODIFIER + * PRINTF_INT32_MODIFIER + * PRINTF_INT16_MODIFIER + * PRINTF_LEAST64_MODIFIER + * PRINTF_LEAST32_MODIFIER + * PRINTF_LEAST16_MODIFIER + * PRINTF_INTPTR_MODIFIER + * + * are strings which have been defined as the modifiers required + * for the "d", "u" and "x" printf formats to correctly output + * (u)intmax_t, (u)int64_t, (u)int32_t, (u)int16_t, (u)least64_t, + * (u)least32_t, (u)least16_t and (u)intptr_t types respectively. + * PRINTF_INTPTR_MODIFIER is not defined for some systems which + * provide their own stdint.h. PRINTF_INT64_MODIFIER is not + * defined if INT64_MAX is not defined. These are an extension + * beyond what C99 specifies must be in stdint.h. + * + * In addition, the following macros are defined: + * + * PRINTF_INTMAX_HEX_WIDTH + * PRINTF_INT64_HEX_WIDTH + * PRINTF_INT32_HEX_WIDTH + * PRINTF_INT16_HEX_WIDTH + * PRINTF_INT8_HEX_WIDTH + * PRINTF_INTMAX_DEC_WIDTH + * PRINTF_INT64_DEC_WIDTH + * PRINTF_INT32_DEC_WIDTH + * PRINTF_INT16_DEC_WIDTH + * PRINTF_UINT8_DEC_WIDTH + * PRINTF_UINTMAX_DEC_WIDTH + * PRINTF_UINT64_DEC_WIDTH + * PRINTF_UINT32_DEC_WIDTH + * PRINTF_UINT16_DEC_WIDTH + * PRINTF_UINT8_DEC_WIDTH + * + * Which specifies the maximum number of characters required to + * print the number of that type in either hexadecimal or decimal. + * These are an extension beyond what C99 specifies must be in + * stdint.h. + * + * Compilers tested (all with 0 warnings at their highest respective + * settings): Borland Turbo C 2.0, WATCOM C/C++ 11.0 (16 bits and 32 + * bits), Microsoft Visual C++ 6.0 (32 bit), Microsoft Visual Studio + * .net (VC7), Intel C++ 4.0, GNU gcc v3.3.3 + * + * This file should be considered a work in progress. Suggestions for + * improvements, especially those which increase coverage are strongly + * encouraged. + * + * Acknowledgements + * + * The following people have made significant contributions to the + * development and testing of this file: + * + * Chris Howie + * John Steele Scott + * Dave Thorup + * John Dill + * Florian Wobbe + * Christopher Sean Morrison + * Mikkel Fahnoe Jorgensen + * + */ + +#include <stddef.h> +#include <limits.h> +#include <signal.h> + +/* + * For gcc with _STDINT_H, fill in the PRINTF_INT*_MODIFIER macros, and + * do nothing else. On the Mac OS X version of gcc this is _STDINT_H_. + */ + +#if ((defined(__SUNPRO_C) && __SUNPRO_C >= 0x570) || (defined(_MSC_VER) && _MSC_VER >= 1600) || (defined(__STDC__) && __STDC__ && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || (defined (__WATCOMC__) && (defined (_STDINT_H_INCLUDED) || __WATCOMC__ >= 1250)) || (defined(__GNUC__) && (__GNUC__ > 3 || defined(_STDINT_H) || defined(_STDINT_H_) || defined (__UINT_FAST64_TYPE__)) )) && !defined (_PSTDINT_H_INCLUDED) +#include <stdint.h> +#define _PSTDINT_H_INCLUDED +# if defined(__GNUC__) && (defined(__x86_64__) || defined(__ppc64__)) && !(defined(__APPLE__) && defined(__MACH__)) +# ifndef PRINTF_INT64_MODIFIER +# define PRINTF_INT64_MODIFIER "l" +# endif +# ifndef PRINTF_INT32_MODIFIER +# define PRINTF_INT32_MODIFIER "" +# endif +# else +# ifndef PRINTF_INT64_MODIFIER +# define PRINTF_INT64_MODIFIER "ll" +# endif +# ifndef PRINTF_INT32_MODIFIER +# if (UINT_MAX == UINT32_MAX) +# define PRINTF_INT32_MODIFIER "" +# else +# define PRINTF_INT32_MODIFIER "l" +# endif +# endif +# endif +# ifndef PRINTF_INT16_MODIFIER +# define PRINTF_INT16_MODIFIER "h" +# endif +# ifndef PRINTF_INTMAX_MODIFIER +# define PRINTF_INTMAX_MODIFIER PRINTF_INT64_MODIFIER +# endif +# ifndef PRINTF_INT64_HEX_WIDTH +# define PRINTF_INT64_HEX_WIDTH "16" +# endif +# ifndef PRINTF_UINT64_HEX_WIDTH +# define PRINTF_UINT64_HEX_WIDTH "16" +# endif +# ifndef PRINTF_INT32_HEX_WIDTH +# define PRINTF_INT32_HEX_WIDTH "8" +# endif +# ifndef PRINTF_UINT32_HEX_WIDTH +# define PRINTF_UINT32_HEX_WIDTH "8" +# endif +# ifndef PRINTF_INT16_HEX_WIDTH +# define PRINTF_INT16_HEX_WIDTH "4" +# endif +# ifndef PRINTF_UINT16_HEX_WIDTH +# define PRINTF_UINT16_HEX_WIDTH "4" +# endif +# ifndef PRINTF_INT8_HEX_WIDTH +# define PRINTF_INT8_HEX_WIDTH "2" +# endif +# ifndef PRINTF_UINT8_HEX_WIDTH +# define PRINTF_UINT8_HEX_WIDTH "2" +# endif +# ifndef PRINTF_INT64_DEC_WIDTH +# define PRINTF_INT64_DEC_WIDTH "19" +# endif +# ifndef PRINTF_UINT64_DEC_WIDTH +# define PRINTF_UINT64_DEC_WIDTH "20" +# endif +# ifndef PRINTF_INT32_DEC_WIDTH +# define PRINTF_INT32_DEC_WIDTH "10" +# endif +# ifndef PRINTF_UINT32_DEC_WIDTH +# define PRINTF_UINT32_DEC_WIDTH "10" +# endif +# ifndef PRINTF_INT16_DEC_WIDTH +# define PRINTF_INT16_DEC_WIDTH "5" +# endif +# ifndef PRINTF_UINT16_DEC_WIDTH +# define PRINTF_UINT16_DEC_WIDTH "5" +# endif +# ifndef PRINTF_INT8_DEC_WIDTH +# define PRINTF_INT8_DEC_WIDTH "3" +# endif +# ifndef PRINTF_UINT8_DEC_WIDTH +# define PRINTF_UINT8_DEC_WIDTH "3" +# endif +# ifndef PRINTF_INTMAX_HEX_WIDTH +# define PRINTF_INTMAX_HEX_WIDTH PRINTF_UINT64_HEX_WIDTH +# endif +# ifndef PRINTF_UINTMAX_HEX_WIDTH +# define PRINTF_UINTMAX_HEX_WIDTH PRINTF_UINT64_HEX_WIDTH +# endif +# ifndef PRINTF_INTMAX_DEC_WIDTH +# define PRINTF_INTMAX_DEC_WIDTH PRINTF_UINT64_DEC_WIDTH +# endif +# ifndef PRINTF_UINTMAX_DEC_WIDTH +# define PRINTF_UINTMAX_DEC_WIDTH PRINTF_UINT64_DEC_WIDTH +# endif + +/* + * Something really weird is going on with Open Watcom. Just pull some of + * these duplicated definitions from Open Watcom's stdint.h file for now. + */ + +# if defined (__WATCOMC__) && __WATCOMC__ >= 1250 +# if !defined (INT64_C) +# define INT64_C(x) (x + (INT64_MAX - INT64_MAX)) +# endif +# if !defined (UINT64_C) +# define UINT64_C(x) (x + (UINT64_MAX - UINT64_MAX)) +# endif +# if !defined (INT32_C) +# define INT32_C(x) (x + (INT32_MAX - INT32_MAX)) +# endif +# if !defined (UINT32_C) +# define UINT32_C(x) (x + (UINT32_MAX - UINT32_MAX)) +# endif +# if !defined (INT16_C) +# define INT16_C(x) (x) +# endif +# if !defined (UINT16_C) +# define UINT16_C(x) (x) +# endif +# if !defined (INT8_C) +# define INT8_C(x) (x) +# endif +# if !defined (UINT8_C) +# define UINT8_C(x) (x) +# endif +# if !defined (UINT64_MAX) +# define UINT64_MAX 18446744073709551615ULL +# endif +# if !defined (INT64_MAX) +# define INT64_MAX 9223372036854775807LL +# endif +# if !defined (UINT32_MAX) +# define UINT32_MAX 4294967295UL +# endif +# if !defined (INT32_MAX) +# define INT32_MAX 2147483647L +# endif +# if !defined (INTMAX_MAX) +# define INTMAX_MAX INT64_MAX +# endif +# if !defined (INTMAX_MIN) +# define INTMAX_MIN INT64_MIN +# endif +# endif +#endif + +/* + * I have no idea what is the truly correct thing to do on older Solaris. + * From some online discussions, this seems to be what is being + * recommended. For people who actually are developing on older Solaris, + * what I would like to know is, does this define all of the relevant + * macros of a complete stdint.h? Remember, in pstdint.h 64 bit is + * considered optional. + */ + +#if (defined(__SUNPRO_C) && __SUNPRO_C >= 0x420) && !defined(_PSTDINT_H_INCLUDED) +#include <sys/inttypes.h> +#define _PSTDINT_H_INCLUDED +#endif + +#ifndef _PSTDINT_H_INCLUDED +#define _PSTDINT_H_INCLUDED + +#ifndef SIZE_MAX +# define SIZE_MAX ((size_t)-1) +#endif + +/* + * Deduce the type assignments from limits.h under the assumption that + * integer sizes in bits are powers of 2, and follow the ANSI + * definitions. + */ + +#ifndef UINT8_MAX +# define UINT8_MAX 0xff +#endif +#if !defined(uint8_t) && !defined(_UINT8_T) && !defined(vxWorks) +# if (UCHAR_MAX == UINT8_MAX) || defined (S_SPLINT_S) + typedef unsigned char uint8_t; +# define UINT8_C(v) ((uint8_t) v) +# else +# error "Platform not supported" +# endif +#endif + +#ifndef INT8_MAX +# define INT8_MAX 0x7f +#endif +#ifndef INT8_MIN +# define INT8_MIN INT8_C(0x80) +#endif +#if !defined(int8_t) && !defined(_INT8_T) && !defined(vxWorks) +# if (SCHAR_MAX == INT8_MAX) || defined (S_SPLINT_S) + typedef signed char int8_t; +# define INT8_C(v) ((int8_t) v) +# else +# error "Platform not supported" +# endif +#endif + +#ifndef UINT16_MAX +# define UINT16_MAX 0xffff +#endif +#if !defined(uint16_t) && !defined(_UINT16_T) && !defined(vxWorks) +#if (UINT_MAX == UINT16_MAX) || defined (S_SPLINT_S) + typedef unsigned int uint16_t; +# ifndef PRINTF_INT16_MODIFIER +# define PRINTF_INT16_MODIFIER "" +# endif +# define UINT16_C(v) ((uint16_t) (v)) +#elif (USHRT_MAX == UINT16_MAX) + typedef unsigned short uint16_t; +# define UINT16_C(v) ((uint16_t) (v)) +# ifndef PRINTF_INT16_MODIFIER +# define PRINTF_INT16_MODIFIER "h" +# endif +#else +#error "Platform not supported" +#endif +#endif + +#ifndef INT16_MAX +# define INT16_MAX 0x7fff +#endif +#ifndef INT16_MIN +# define INT16_MIN INT16_C(0x8000) +#endif +#if !defined(int16_t) && !defined(_INT16_T) && !defined(vxWorks) +#if (INT_MAX == INT16_MAX) || defined (S_SPLINT_S) + typedef signed int int16_t; +# define INT16_C(v) ((int16_t) (v)) +# ifndef PRINTF_INT16_MODIFIER +# define PRINTF_INT16_MODIFIER "" +# endif +#elif (SHRT_MAX == INT16_MAX) + typedef signed short int16_t; +# define INT16_C(v) ((int16_t) (v)) +# ifndef PRINTF_INT16_MODIFIER +# define PRINTF_INT16_MODIFIER "h" +# endif +#else +#error "Platform not supported" +#endif +#endif + +#ifndef UINT32_MAX +# define UINT32_MAX (0xffffffffUL) +#endif +#if !defined(uint32_t) && !defined(_UINT32_T) && !defined(vxWorks) +#if (ULONG_MAX == UINT32_MAX) || defined (S_SPLINT_S) + typedef unsigned long uint32_t; +# define UINT32_C(v) v ## UL +# ifndef PRINTF_INT32_MODIFIER +# define PRINTF_INT32_MODIFIER "l" +# endif +#elif (UINT_MAX == UINT32_MAX) + typedef unsigned int uint32_t; +# ifndef PRINTF_INT32_MODIFIER +# define PRINTF_INT32_MODIFIER "" +# endif +# define UINT32_C(v) v ## U +#elif (USHRT_MAX == UINT32_MAX) + typedef unsigned short uint32_t; +# define UINT32_C(v) ((unsigned short) (v)) +# ifndef PRINTF_INT32_MODIFIER +# define PRINTF_INT32_MODIFIER "" +# endif +#else +#error "Platform not supported" +#endif +#endif + +#ifndef INT32_MAX +# define INT32_MAX (0x7fffffffL) +#endif +#ifndef INT32_MIN +# define INT32_MIN INT32_C(0x80000000) +#endif +#if !defined(int32_t) && !defined(_INT32_T) && !defined(vxWorks) +#if (LONG_MAX == INT32_MAX) || defined (S_SPLINT_S) + typedef signed long int32_t; +# define INT32_C(v) v ## L +# ifndef PRINTF_INT32_MODIFIER +# define PRINTF_INT32_MODIFIER "l" +# endif +#elif (INT_MAX == INT32_MAX) + typedef signed int int32_t; +# define INT32_C(v) v +# ifndef PRINTF_INT32_MODIFIER +# define PRINTF_INT32_MODIFIER "" +# endif +#elif (SHRT_MAX == INT32_MAX) + typedef signed short int32_t; +# define INT32_C(v) ((short) (v)) +# ifndef PRINTF_INT32_MODIFIER +# define PRINTF_INT32_MODIFIER "" +# endif +#else +#error "Platform not supported" +#endif +#endif + +/* + * The macro stdint_int64_defined is temporarily used to record + * whether or not 64 integer support is available. It must be + * defined for any 64 integer extensions for new platforms that are + * added. + */ + +#undef stdint_int64_defined +#if (defined(__STDC__) && defined(__STDC_VERSION__)) || defined (S_SPLINT_S) +# if (__STDC__ && __STDC_VERSION__ >= 199901L) || defined (S_SPLINT_S) +# define stdint_int64_defined + typedef long long int64_t; + typedef unsigned long long uint64_t; +# define UINT64_C(v) v ## ULL +# define INT64_C(v) v ## LL +# ifndef PRINTF_INT64_MODIFIER +# define PRINTF_INT64_MODIFIER "ll" +# endif +# endif +#endif + +#if !defined (stdint_int64_defined) +# if defined(__GNUC__) && !defined(vxWorks) +# define stdint_int64_defined + __extension__ typedef long long int64_t; + __extension__ typedef unsigned long long uint64_t; +# define UINT64_C(v) v ## ULL +# define INT64_C(v) v ## LL +# ifndef PRINTF_INT64_MODIFIER +# define PRINTF_INT64_MODIFIER "ll" +# endif +# elif defined(__MWERKS__) || defined (__SUNPRO_C) || defined (__SUNPRO_CC) || defined (__APPLE_CC__) || defined (_LONG_LONG) || defined (_CRAYC) || defined (S_SPLINT_S) +# define stdint_int64_defined + typedef long long int64_t; + typedef unsigned long long uint64_t; +# define UINT64_C(v) v ## ULL +# define INT64_C(v) v ## LL +# ifndef PRINTF_INT64_MODIFIER +# define PRINTF_INT64_MODIFIER "ll" +# endif +# elif (defined(__WATCOMC__) && defined(__WATCOM_INT64__)) || (defined(_MSC_VER) && _INTEGRAL_MAX_BITS >= 64) || (defined (__BORLANDC__) && __BORLANDC__ > 0x460) || defined (__alpha) || defined (__DECC) +# define stdint_int64_defined + typedef __int64 int64_t; + typedef unsigned __int64 uint64_t; +# define UINT64_C(v) v ## UI64 +# define INT64_C(v) v ## I64 +# ifndef PRINTF_INT64_MODIFIER +# define PRINTF_INT64_MODIFIER "I64" +# endif +# endif +#endif + +#if !defined (LONG_LONG_MAX) && defined (INT64_C) +# define LONG_LONG_MAX INT64_C (9223372036854775807) +#endif +#ifndef ULONG_LONG_MAX +# define ULONG_LONG_MAX UINT64_C (18446744073709551615) +#endif + +#if !defined (INT64_MAX) && defined (INT64_C) +# define INT64_MAX INT64_C (9223372036854775807) +#endif +#if !defined (INT64_MIN) && defined (INT64_C) +# define INT64_MIN INT64_C (-9223372036854775808) +#endif +#if !defined (UINT64_MAX) && defined (INT64_C) +# define UINT64_MAX UINT64_C (18446744073709551615) +#endif + +/* + * Width of hexadecimal for number field. + */ + +#ifndef PRINTF_INT64_HEX_WIDTH +# define PRINTF_INT64_HEX_WIDTH "16" +#endif +#ifndef PRINTF_INT32_HEX_WIDTH +# define PRINTF_INT32_HEX_WIDTH "8" +#endif +#ifndef PRINTF_INT16_HEX_WIDTH +# define PRINTF_INT16_HEX_WIDTH "4" +#endif +#ifndef PRINTF_INT8_HEX_WIDTH +# define PRINTF_INT8_HEX_WIDTH "2" +#endif +#ifndef PRINTF_INT64_DEC_WIDTH +# define PRINTF_INT64_DEC_WIDTH "19" +#endif +#ifndef PRINTF_INT32_DEC_WIDTH +# define PRINTF_INT32_DEC_WIDTH "10" +#endif +#ifndef PRINTF_INT16_DEC_WIDTH +# define PRINTF_INT16_DEC_WIDTH "5" +#endif +#ifndef PRINTF_INT8_DEC_WIDTH +# define PRINTF_INT8_DEC_WIDTH "3" +#endif +#ifndef PRINTF_UINT64_DEC_WIDTH +# define PRINTF_UINT64_DEC_WIDTH "20" +#endif +#ifndef PRINTF_UINT32_DEC_WIDTH +# define PRINTF_UINT32_DEC_WIDTH "10" +#endif +#ifndef PRINTF_UINT16_DEC_WIDTH +# define PRINTF_UINT16_DEC_WIDTH "5" +#endif +#ifndef PRINTF_UINT8_DEC_WIDTH +# define PRINTF_UINT8_DEC_WIDTH "3" +#endif + +/* + * Ok, lets not worry about 128 bit integers for now. Moore's law says + * we don't need to worry about that until about 2040 at which point + * we'll have bigger things to worry about. + */ + +#ifdef stdint_int64_defined + typedef int64_t intmax_t; + typedef uint64_t uintmax_t; +# define INTMAX_MAX INT64_MAX +# define INTMAX_MIN INT64_MIN +# define UINTMAX_MAX UINT64_MAX +# define UINTMAX_C(v) UINT64_C(v) +# define INTMAX_C(v) INT64_C(v) +# ifndef PRINTF_INTMAX_MODIFIER +# define PRINTF_INTMAX_MODIFIER PRINTF_INT64_MODIFIER +# endif +# ifndef PRINTF_INTMAX_HEX_WIDTH +# define PRINTF_INTMAX_HEX_WIDTH PRINTF_INT64_HEX_WIDTH +# endif +# ifndef PRINTF_INTMAX_DEC_WIDTH +# define PRINTF_INTMAX_DEC_WIDTH PRINTF_INT64_DEC_WIDTH +# endif +#else + typedef int32_t intmax_t; + typedef uint32_t uintmax_t; +# define INTMAX_MAX INT32_MAX +# define UINTMAX_MAX UINT32_MAX +# define UINTMAX_C(v) UINT32_C(v) +# define INTMAX_C(v) INT32_C(v) +# ifndef PRINTF_INTMAX_MODIFIER +# define PRINTF_INTMAX_MODIFIER PRINTF_INT32_MODIFIER +# endif +# ifndef PRINTF_INTMAX_HEX_WIDTH +# define PRINTF_INTMAX_HEX_WIDTH PRINTF_INT32_HEX_WIDTH +# endif +# ifndef PRINTF_INTMAX_DEC_WIDTH +# define PRINTF_INTMAX_DEC_WIDTH PRINTF_INT32_DEC_WIDTH +# endif +#endif + +/* + * Because this file currently only supports platforms which have + * precise powers of 2 as bit sizes for the default integers, the + * least definitions are all trivial. Its possible that a future + * version of this file could have different definitions. + */ + +#ifndef stdint_least_defined + typedef int8_t int_least8_t; + typedef uint8_t uint_least8_t; + typedef int16_t int_least16_t; + typedef uint16_t uint_least16_t; + typedef int32_t int_least32_t; + typedef uint32_t uint_least32_t; +# define PRINTF_LEAST32_MODIFIER PRINTF_INT32_MODIFIER +# define PRINTF_LEAST16_MODIFIER PRINTF_INT16_MODIFIER +# define UINT_LEAST8_MAX UINT8_MAX +# define INT_LEAST8_MAX INT8_MAX +# define UINT_LEAST16_MAX UINT16_MAX +# define INT_LEAST16_MAX INT16_MAX +# define UINT_LEAST32_MAX UINT32_MAX +# define INT_LEAST32_MAX INT32_MAX +# define INT_LEAST8_MIN INT8_MIN +# define INT_LEAST16_MIN INT16_MIN +# define INT_LEAST32_MIN INT32_MIN +# ifdef stdint_int64_defined + typedef int64_t int_least64_t; + typedef uint64_t uint_least64_t; +# define PRINTF_LEAST64_MODIFIER PRINTF_INT64_MODIFIER +# define UINT_LEAST64_MAX UINT64_MAX +# define INT_LEAST64_MAX INT64_MAX +# define INT_LEAST64_MIN INT64_MIN +# endif +#endif +#undef stdint_least_defined + +/* + * The ANSI C committee has defined *int*_fast*_t types as well. This, + * of course, defies rationality -- you can't know what will be fast + * just from the type itself. Even for a given architecture, compatible + * implementations might have different performance characteristics. + * Developers are warned to stay away from these types when using this + * or any other stdint.h. + */ + +typedef int_least8_t int_fast8_t; +typedef uint_least8_t uint_fast8_t; +typedef int_least16_t int_fast16_t; +typedef uint_least16_t uint_fast16_t; +typedef int_least32_t int_fast32_t; +typedef uint_least32_t uint_fast32_t; +#define UINT_FAST8_MAX UINT_LEAST8_MAX +#define INT_FAST8_MAX INT_LEAST8_MAX +#define UINT_FAST16_MAX UINT_LEAST16_MAX +#define INT_FAST16_MAX INT_LEAST16_MAX +#define UINT_FAST32_MAX UINT_LEAST32_MAX +#define INT_FAST32_MAX INT_LEAST32_MAX +#define INT_FAST8_MIN INT_LEAST8_MIN +#define INT_FAST16_MIN INT_LEAST16_MIN +#define INT_FAST32_MIN INT_LEAST32_MIN +#ifdef stdint_int64_defined + typedef int_least64_t int_fast64_t; + typedef uint_least64_t uint_fast64_t; +# define UINT_FAST64_MAX UINT_LEAST64_MAX +# define INT_FAST64_MAX INT_LEAST64_MAX +# define INT_FAST64_MIN INT_LEAST64_MIN +#endif + +#undef stdint_int64_defined + +/* + * Whatever piecemeal, per compiler thing we can do about the wchar_t + * type limits. + */ + +#if defined(__WATCOMC__) || defined(_MSC_VER) || defined (__GNUC__) && !defined(vxWorks) +# include <wchar.h> +# ifndef WCHAR_MIN +# define WCHAR_MIN 0 +# endif +# ifndef WCHAR_MAX +# define WCHAR_MAX ((wchar_t)-1) +# endif +#endif + +/* + * Whatever piecemeal, per compiler/platform thing we can do about the + * (u)intptr_t types and limits. + */ + +#if (defined (_MSC_VER) && defined (_UINTPTR_T_DEFINED)) || defined (_UINTPTR_T) +# define STDINT_H_UINTPTR_T_DEFINED +#endif + +#ifndef STDINT_H_UINTPTR_T_DEFINED +# if defined (__alpha__) || defined (__ia64__) || defined (__x86_64__) || defined (_WIN64) || defined (__ppc64__) +# define stdint_intptr_bits 64 +# elif defined (__WATCOMC__) || defined (__TURBOC__) +# if defined(__TINY__) || defined(__SMALL__) || defined(__MEDIUM__) +# define stdint_intptr_bits 16 +# else +# define stdint_intptr_bits 32 +# endif +# elif defined (__i386__) || defined (_WIN32) || defined (WIN32) || defined (__ppc64__) +# define stdint_intptr_bits 32 +# elif defined (__INTEL_COMPILER) +/* TODO -- what did Intel do about x86-64? */ +# else +/* #error "This platform might not be supported yet" */ +# endif + +# ifdef stdint_intptr_bits +# define stdint_intptr_glue3_i(a,b,c) a##b##c +# define stdint_intptr_glue3(a,b,c) stdint_intptr_glue3_i(a,b,c) +# ifndef PRINTF_INTPTR_MODIFIER +# define PRINTF_INTPTR_MODIFIER stdint_intptr_glue3(PRINTF_INT,stdint_intptr_bits,_MODIFIER) +# endif +# ifndef PTRDIFF_MAX +# define PTRDIFF_MAX stdint_intptr_glue3(INT,stdint_intptr_bits,_MAX) +# endif +# ifndef PTRDIFF_MIN +# define PTRDIFF_MIN stdint_intptr_glue3(INT,stdint_intptr_bits,_MIN) +# endif +# ifndef UINTPTR_MAX +# define UINTPTR_MAX stdint_intptr_glue3(UINT,stdint_intptr_bits,_MAX) +# endif +# ifndef INTPTR_MAX +# define INTPTR_MAX stdint_intptr_glue3(INT,stdint_intptr_bits,_MAX) +# endif +# ifndef INTPTR_MIN +# define INTPTR_MIN stdint_intptr_glue3(INT,stdint_intptr_bits,_MIN) +# endif +# ifndef INTPTR_C +# define INTPTR_C(x) stdint_intptr_glue3(INT,stdint_intptr_bits,_C)(x) +# endif +# ifndef UINTPTR_C +# define UINTPTR_C(x) stdint_intptr_glue3(UINT,stdint_intptr_bits,_C)(x) +# endif + typedef stdint_intptr_glue3(uint,stdint_intptr_bits,_t) uintptr_t; + typedef stdint_intptr_glue3( int,stdint_intptr_bits,_t) intptr_t; +# else +/* TODO -- This following is likely wrong for some platforms, and does + nothing for the definition of uintptr_t. */ + typedef ptrdiff_t intptr_t; +# endif +# define STDINT_H_UINTPTR_T_DEFINED +#endif + +/* + * Assumes sig_atomic_t is signed and we have a 2s complement machine. + */ + +#ifndef SIG_ATOMIC_MAX +# define SIG_ATOMIC_MAX ((((sig_atomic_t) 1) << (sizeof (sig_atomic_t)*CHAR_BIT-1)) - 1) +#endif + +#endif + +#if defined (__TEST_PSTDINT_FOR_CORRECTNESS) + +/* + * Please compile with the maximum warning settings to make sure macros are + * not defined more than once. + */ + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#define glue3_aux(x,y,z) x ## y ## z +#define glue3(x,y,z) glue3_aux(x,y,z) + +#define DECLU(bits) glue3(uint,bits,_t) glue3(u,bits,) = glue3(UINT,bits,_C) (0); +#define DECLI(bits) glue3(int,bits,_t) glue3(i,bits,) = glue3(INT,bits,_C) (0); + +#define DECL(us,bits) glue3(DECL,us,) (bits) + +#define TESTUMAX(bits) glue3(u,bits,) = ~glue3(u,bits,); if (glue3(UINT,bits,_MAX) != glue3(u,bits,)) printf ("Something wrong with UINT%d_MAX\n", bits) + +#define REPORTERROR(msg) { err_n++; if (err_first <= 0) err_first = __LINE__; printf msg; } + +#define X_SIZE_MAX ((size_t)-1) + +int main () { + int err_n = 0; + int err_first = 0; + DECL(I,8) + DECL(U,8) + DECL(I,16) + DECL(U,16) + DECL(I,32) + DECL(U,32) +#ifdef INT64_MAX + DECL(I,64) + DECL(U,64) +#endif + intmax_t imax = INTMAX_C(0); + uintmax_t umax = UINTMAX_C(0); + char str0[256], str1[256]; + + sprintf (str0, "%" PRINTF_INT32_MODIFIER "d", INT32_C(2147483647)); + if (0 != strcmp (str0, "2147483647")) REPORTERROR (("Something wrong with PRINTF_INT32_MODIFIER : %s\n", str0)); + if (atoi(PRINTF_INT32_DEC_WIDTH) != (int) strlen(str0)) REPORTERROR (("Something wrong with PRINTF_INT32_DEC_WIDTH : %s\n", PRINTF_INT32_DEC_WIDTH)); + sprintf (str0, "%" PRINTF_INT32_MODIFIER "u", UINT32_C(4294967295)); + if (0 != strcmp (str0, "4294967295")) REPORTERROR (("Something wrong with PRINTF_INT32_MODIFIER : %s\n", str0)); + if (atoi(PRINTF_UINT32_DEC_WIDTH) != (int) strlen(str0)) REPORTERROR (("Something wrong with PRINTF_UINT32_DEC_WIDTH : %s\n", PRINTF_UINT32_DEC_WIDTH)); +#ifdef INT64_MAX + sprintf (str1, "%" PRINTF_INT64_MODIFIER "d", INT64_C(9223372036854775807)); + if (0 != strcmp (str1, "9223372036854775807")) REPORTERROR (("Something wrong with PRINTF_INT32_MODIFIER : %s\n", str1)); + if (atoi(PRINTF_INT64_DEC_WIDTH) != (int) strlen(str1)) REPORTERROR (("Something wrong with PRINTF_INT64_DEC_WIDTH : %s, %d\n", PRINTF_INT64_DEC_WIDTH, (int) strlen(str1))); + sprintf (str1, "%" PRINTF_INT64_MODIFIER "u", UINT64_C(18446744073709550591)); + if (0 != strcmp (str1, "18446744073709550591")) REPORTERROR (("Something wrong with PRINTF_INT32_MODIFIER : %s\n", str1)); + if (atoi(PRINTF_UINT64_DEC_WIDTH) != (int) strlen(str1)) REPORTERROR (("Something wrong with PRINTF_UINT64_DEC_WIDTH : %s, %d\n", PRINTF_UINT64_DEC_WIDTH, (int) strlen(str1))); +#endif + + sprintf (str0, "%d %x\n", 0, ~0); + + sprintf (str1, "%d %x\n", i8, ~0); + if (0 != strcmp (str0, str1)) REPORTERROR (("Something wrong with i8 : %s\n", str1)); + sprintf (str1, "%u %x\n", u8, ~0); + if (0 != strcmp (str0, str1)) REPORTERROR (("Something wrong with u8 : %s\n", str1)); + sprintf (str1, "%d %x\n", i16, ~0); + if (0 != strcmp (str0, str1)) REPORTERROR (("Something wrong with i16 : %s\n", str1)); + sprintf (str1, "%u %x\n", u16, ~0); + if (0 != strcmp (str0, str1)) REPORTERROR (("Something wrong with u16 : %s\n", str1)); + sprintf (str1, "%" PRINTF_INT32_MODIFIER "d %x\n", i32, ~0); + if (0 != strcmp (str0, str1)) REPORTERROR (("Something wrong with i32 : %s\n", str1)); + sprintf (str1, "%" PRINTF_INT32_MODIFIER "u %x\n", u32, ~0); + if (0 != strcmp (str0, str1)) REPORTERROR (("Something wrong with u32 : %s\n", str1)); +#ifdef INT64_MAX + sprintf (str1, "%" PRINTF_INT64_MODIFIER "d %x\n", i64, ~0); + if (0 != strcmp (str0, str1)) REPORTERROR (("Something wrong with i64 : %s\n", str1)); +#endif + sprintf (str1, "%" PRINTF_INTMAX_MODIFIER "d %x\n", imax, ~0); + if (0 != strcmp (str0, str1)) REPORTERROR (("Something wrong with imax : %s\n", str1)); + sprintf (str1, "%" PRINTF_INTMAX_MODIFIER "u %x\n", umax, ~0); + if (0 != strcmp (str0, str1)) REPORTERROR (("Something wrong with umax : %s\n", str1)); + + TESTUMAX(8); + TESTUMAX(16); + TESTUMAX(32); +#ifdef INT64_MAX + TESTUMAX(64); +#endif + +#define STR(v) #v +#define Q(v) printf ("sizeof " STR(v) " = %u\n", (unsigned) sizeof (v)); + if (err_n) { + printf ("pstdint.h is not correct. Please use sizes below to correct it:\n"); + } + + Q(int) + Q(unsigned) + Q(long int) + Q(short int) + Q(int8_t) + Q(int16_t) + Q(int32_t) +#ifdef INT64_MAX + Q(int64_t) +#endif + +#if UINT_MAX < X_SIZE_MAX + printf ("UINT_MAX < X_SIZE_MAX\n"); +#else + printf ("UINT_MAX >= X_SIZE_MAX\n"); +#endif + printf ("%" PRINTF_INT64_MODIFIER "u vs %" PRINTF_INT64_MODIFIER "u\n", UINT_MAX, X_SIZE_MAX); + + return EXIT_SUCCESS; +} + +#endif diff --git a/compat/strtol.c b/compat/strtol.c index 22cc1eb..a9866f4 100644 --- a/compat/strtol.c +++ b/compat/strtol.c @@ -53,7 +53,7 @@ strtol( */ p = string; - while (TclIsSpaceProc(*p)) { + while (isspace(UCHAR(*p))) { p += 1; } diff --git a/compat/strtoul.c b/compat/strtoul.c index bf16f7a..af63036 100644 --- a/compat/strtoul.c +++ b/compat/strtoul.c @@ -74,7 +74,7 @@ strtoul( */ p = string; - while (TclIsSpaceProc(*p)) { + while (isspace(UCHAR(*p))) { p += 1; } if (*p == '-') { diff --git a/doc/CrtChannel.3 b/doc/CrtChannel.3 index b987646..c113efb 100644 --- a/doc/CrtChannel.3 +++ b/doc/CrtChannel.3 @@ -648,8 +648,8 @@ It should call \fBTcl_BadChannelOption\fR which itself returns unrecognized. If \fInewValue\fR specifies a value for the option that is not supported or if a system call error occurs, -the function should leave an error message in the -\fIresult\fR field of \fIinterp\fR if \fIinterp\fR is not NULL. The +the function should leave an error message in the result +of \fIinterp\fR if \fIinterp\fR is not NULL. The function should also call \fBTcl_SetErrno\fR to store an appropriate POSIX error code. .PP diff --git a/doc/CrtInterp.3 b/doc/CrtInterp.3 index 1d49158..aacb868 100644 --- a/doc/CrtInterp.3 +++ b/doc/CrtInterp.3 @@ -22,10 +22,8 @@ Tcl_Interp * int \fBTcl_InterpDeleted\fR(\fIinterp\fR) .sp -.VS 8.6 int \fBTcl_InterpActive\fR(\fIinterp\fR) -.VE 8.6 .SH ARGUMENTS .AS Tcl_Interp *interp .AP Tcl_Interp *interp in @@ -70,14 +68,12 @@ deleted and when the whole interpreter is being deleted. In the former case the callback may recreate the data being deleted, but this would lead to an infinite loop if the interpreter were being deleted. .PP -.VS 8.6 \fBTcl_InterpActive\fR is useful for determining whether there is any execution of scripts ongoing in an interpreter, which is a useful piece of information when Tcl is embedded in a garbage-collected environment and it becomes necessary to determine whether the interpreter is a candidate for deletion. The function returns a true value if the interpreter has at least one active execution running inside it, and a false value otherwise. -.VE 8.6 .SH "INTERPRETERS AND MEMORY MANAGEMENT" .PP \fBTcl_DeleteInterp\fR can be called at any time on an interpreter that may @@ -138,12 +134,10 @@ All uses of interpreters in Tcl and Tk have already been protected. Extension writers should ensure that their code also properly protects any additional interpreters used, as described above. .PP -.VS 8.6 Note that the protection mechanisms do not work well with conventional garbage collection systems. When in such a managed environment, \fBTcl_InterpActive\fR should be used to determine when an interpreter is a candidate for deletion due to inactivity. -.VE 8.6 .SH "SEE ALSO" Tcl_Preserve(3), Tcl_Release(3) .SH KEYWORDS diff --git a/doc/CrtSlave.3 b/doc/CrtSlave.3 index ac681bc..b8ac421 100644 --- a/doc/CrtSlave.3 +++ b/doc/CrtSlave.3 @@ -119,7 +119,7 @@ in a hierarchical relationship, and the management of aliases, commands that when invoked in one interpreter execute a command in another interpreter. The return value for those procedures that return an \fBint\fR is either \fBTCL_OK\fR or \fBTCL_ERROR\fR. If \fBTCL_ERROR\fR is returned -then the \fBresult\fR field of the interpreter contains an error message. +then the interpreter's result contains an error message. .PP \fBTcl_CreateSlave\fR creates a new interpreter as a slave of \fIinterp\fR. It also creates a slave command named \fIslaveName\fR in \fIinterp\fR which @@ -158,12 +158,12 @@ If no such slave interpreter exists, \fBNULL\fR is returned. \fIinterp\fR. If \fIinterp\fR has no master (it is a top-level interpreter) then \fBNULL\fR is returned. .PP -\fBTcl_GetInterpPath\fR sets the \fIresult\fR field in \fIaskingInterp\fR -to the relative path between \fIaskingInterp\fR and \fIslaveInterp\fR; +\fBTcl_GetInterpPath\fR stores in the result of \fIaskingInterp\fR +the relative path between \fIaskingInterp\fR and \fIslaveInterp\fR; \fIslaveInterp\fR must be a slave of \fIaskingInterp\fR. If the computation of the relative path succeeds, \fBTCL_OK\fR is returned, else -\fBTCL_ERROR\fR is returned and the \fIresult\fR field in -\fIaskingInterp\fR contains the error message. +\fBTCL_ERROR\fR is returned and an error message is stored as the +result of \fIaskingInterp\fR. .PP \fBTcl_CreateAlias\fR creates a command named \fIslaveCmd\fR in \fIslaveInterp\fR that when invoked, will cause the command \fItargetCmd\fR @@ -198,33 +198,33 @@ the set of hidden commands to the set of exposed commands, putting it under the name \fIcmdName\fR. \fIHiddenCmdName\fR must be the name of an existing hidden -command, or the operation will return \fBTCL_ERROR\fR and leave an error -message in the \fIresult\fR field in \fIinterp\fR. +command, or the operation will return \fBTCL_ERROR\fR and +leave an error message as the result of \fIinterp\fR. If an exposed command named \fIcmdName\fR already exists, -the operation returns \fBTCL_ERROR\fR and leaves an error message in the -value result of \fIinterp\fR. +the operation returns \fBTCL_ERROR\fR and leaves an error message as +the result of \fIinterp\fR. If the operation succeeds, it returns \fBTCL_OK\fR. -After executing this command, attempts to use \fIcmdName\fR in a call to -\fBTcl_Eval\fR or with the Tcl \fBeval\fR command will again succeed. +After executing this command, attempts to use \fIcmdName\fR in any +script evaluation mechanism will again succeed. .PP \fBTcl_HideCommand\fR moves the command named \fIcmdName\fR from the set of exposed commands to the set of hidden commands, under the name \fIhiddenCmdName\fR. \fICmdName\fR must be the name of an existing exposed command, or the operation will return \fBTCL_ERROR\fR and leave an error -message in the value result of \fIinterp\fR. +message as the result of \fIinterp\fR. Currently both \fIcmdName\fR and \fIhiddenCmdName\fR must not contain namespace qualifiers, or the operation will return \fBTCL_ERROR\fR and -leave an error message in the value result of \fIinterp\fR. +leave an error message as the result of \fIinterp\fR. The \fICmdName\fR will be looked up in the global namespace, and not relative to the current namespace, even if the current namespace is not the global one. If a hidden command whose name is \fIhiddenCmdName\fR already -exists, the operation also returns \fBTCL_ERROR\fR and the \fIresult\fR -field in \fIinterp\fR contains an error message. +exists, the operation also returns \fBTCL_ERROR\fR and an error +message is left as the result of \fIinterp\fR. If the operation succeeds, it returns \fBTCL_OK\fR. -After executing this command, attempts to use \fIcmdName\fR in a call to -\fBTcl_Eval\fR or with the Tcl \fBeval\fR command will fail. +After executing this command, attempts to use \fIcmdName\fR in +any script evaluation mechanism will fail. .PP For a description of the Tcl interface to multiple interpreters, see \fIinterp(n)\fR. diff --git a/doc/Ensemble.3 b/doc/Ensemble.3 index 30c1d3b..febc48f 100644 --- a/doc/Ensemble.3 +++ b/doc/Ensemble.3 @@ -36,13 +36,11 @@ int int \fBTcl_SetEnsembleMappingDict\fR(\fIinterp, token, dictObj\fR) .sp -.VS 8.6 int \fBTcl_GetEnsembleParameterList\fR(\fIinterp, token, listObjPtr\fR) .sp int \fBTcl_SetEnsembleParameterList\fR(\fIinterp, token, listObj\fR) -.VE 8.6 .sp int \fBTcl_GetEnsembleSubcommandList\fR(\fIinterp, token, listObjPtr\fR) @@ -163,7 +161,6 @@ All command names in prefixes set via \fBTcl_SetEnsembleMappingDict\fR must be fully qualified. .TP \fBformal pre-subcommand parameter list\fR (read-write) -.VS 8.6 A list of formal parameter names (the names only being used when generating error messages) that come at invocation of the ensemble between the name of the ensemble and the subcommand argument. NULL (the default) is equivalent to @@ -174,7 +171,6 @@ respectively. The result of both of those functions is a Tcl result code ensemble) and the dictionary obtained from \fBTcl_GetEnsembleParameterList\fR should always be treated as immutable even if it is unshared. -.VE 8.6 .TP \fBsubcommand list\fR (read-write) . @@ -138,7 +138,7 @@ equivalent to using the \fBTCL_EVAL_GLOBAL\fR flag (see below). of any length, concatenates them into a single string, then calls \fBTcl_Eval\fR to execute that string as a Tcl command. It returns the result of the command and also modifies -\fIinterp->result\fR in the same way as \fBTcl_Eval\fR. +the interpreter result in the same way as \fBTcl_Eval\fR. The last argument to \fBTcl_VarEval\fR must be NULL to indicate the end of arguments. \fBTcl_VarEval\fR is now deprecated. diff --git a/doc/FileSystem.3 b/doc/FileSystem.3 index 7fe9194..8bf16e8 100644 --- a/doc/FileSystem.3 +++ b/doc/FileSystem.3 @@ -63,10 +63,8 @@ int \fBTcl_FSLoadFile\fR(\fIinterp, pathPtr, sym1, sym2, proc1Ptr, proc2Ptr, loadHandlePtr, unloadProcPtr\fR) .sp -.VS 8.6 int \fBTcl_FSUnloadFile\fR(\fIinterp, loadHandle\fR) -.VE 8.6 .sp int \fBTcl_FSMatchInDirectory\fR(\fIinterp, resultPtr, pathPtr, pattern, types\fR) @@ -146,7 +144,6 @@ Tcl_Obj * Tcl_StatBuf * \fBTcl_AllocStatBuf\fR() .sp -.VS 8.6 Tcl_WideInt \fBTcl_GetAccessTimeFromStat\fR(\fIstatPtr\fR) .sp @@ -185,7 +182,6 @@ Tcl_WideUInt .sp int \fBTcl_GetUserIdFromStat\fR(\fIstatPtr\fR) -.VE 8.6 .SH ARGUMENTS .AS Tcl_GlobTypeData **srcPathPtr out .AP "const Tcl_Filesystem" *fsPtr in @@ -444,20 +440,16 @@ belongs will be called. If that filesystem does not implement this function (most virtual filesystems will not, because of OS limitations in dynamically loading binary code), Tcl will attempt to copy the file to a temporary directory and load that temporary file. -.VS 8.6 \fBTcl_FSUnloadFile\fR reverses the operation, asking for the library indicated by the \fIloadHandle\fR to be removed from the process. Note that, unlike with the \fBunload\fR command, this does not give the library any opportunity to clean up. -.VE 8.6 .PP Both the above functions return a standard Tcl completion code. If an error occurs, an error message is left in the \fIinterp\fR's result. .PP -.VS 8.6 The token provided via the variable indicated by \fIloadHandlePtr\fR may be used with \fBTcl_FindSymbol\fR. -.VE 8.6 .PP \fBTcl_FSMatchInDirectory\fR is used by the globbing code to search a directory for all files which match a given pattern. The appropriate @@ -795,7 +787,6 @@ may be deallocated by being passed to \fBTcl_Free\fR). This allows extensions to invoke \fBTcl_FSStat\fR and \fBTcl_FSLstat\fR without being dependent on the size of the buffer. That in turn depends on the flags used to build Tcl. .PP -.VS 8.6 The portable fields of a \fITcl_StatBuf\fR may be read using the following functions, each of which returns the value of the corresponding field listed in the table below. Note that on some platforms there may be other fields in @@ -819,7 +810,6 @@ for a full description of these fields. \fBTcl_GetBlocksFromStat\fR st_blocks \fBTcl_GetBlockSizeFromStat\fR st_blksize .DE -.VE 8.6 .SH "THE VIRTUAL FILESYSTEM API" .PP A filesystem provides a \fBTcl_Filesystem\fR structure that contains diff --git a/doc/Interp.3 b/doc/Interp.3 deleted file mode 100644 index 64cb5a0..0000000 --- a/doc/Interp.3 +++ /dev/null @@ -1,121 +0,0 @@ -'\" -'\" Copyright (c) 1989-1993 The Regents of the University of California. -'\" Copyright (c) 1994-1996 Sun Microsystems, Inc. -'\" -'\" See the file "license.terms" for information on usage and redistribution -'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. -'\" -.TH Tcl_Interp 3 7.5 Tcl "Tcl Library Procedures" -.so man.macros -.BS -.SH NAME -Tcl_Interp \- client-visible fields of interpreter structures -.SH SYNOPSIS -.nf -\fB#include <tcl.h>\fR -.sp -typedef struct { - char *\fIresult\fR; - Tcl_FreeProc *\fIfreeProc\fR; - int \fIerrorLine\fR; -} \fBTcl_Interp\fR; - -typedef void \fBTcl_FreeProc\fR( - char *\fIblockPtr\fR); -.BE -.SH DESCRIPTION -.PP -The \fBTcl_CreateInterp\fR procedure returns a pointer to a Tcl_Interp -structure. Callers of \fBTcl_CreateInterp\fR should use this pointer -as an opaque token, suitable for nothing other than passing back to -other routines in the Tcl interface. Accessing fields directly through -the pointer as described below is no longer supported. The supported -public routines \fBTcl_SetResult\fR, \fBTcl_GetResult\fR, -\fBTcl_SetErrorLine\fR, \fBTcl_GetErrorLine\fR must be used instead. -.PP -The \fIresult\fR and \fIfreeProc\fR fields are used to return -results or error messages from commands. -This information is returned by command procedures back to \fBTcl_Eval\fR, -and by \fBTcl_Eval\fR back to its callers. -The \fIresult\fR field points to the string that represents the -result or error message, and the \fIfreeProc\fR field tells how -to dispose of the storage for the string when it is not needed anymore. -The easiest way for command procedures to manipulate these -fields is to call procedures like \fBTcl_SetResult\fR -or \fBTcl_AppendResult\fR; they -will hide all the details of managing the fields. -The description below is for those procedures that manipulate the -fields directly. -.PP -Whenever a command procedure returns, it must ensure -that the \fIresult\fR field of its interpreter points to the string -being returned by the command. -The \fIresult\fR field must always point to a valid string. -If a command wishes to return no result then \fIinterp->result\fR -should point to an empty string. -Normally, results are assumed to be statically allocated, -which means that the contents will not change before the next time -\fBTcl_Eval\fR is called or some other command procedure is invoked. -In this case, the \fIfreeProc\fR field must be zero. -Alternatively, a command procedure may dynamically -allocate its return value (e.g. using \fBTcl_Alloc\fR) -and store a pointer to it in \fIinterp->result\fR. -In this case, the command procedure must also set \fIinterp->freeProc\fR -to the address of a procedure that can free the value, or \fBTCL_DYNAMIC\fR -if the storage was allocated directly by Tcl or by a call to -\fBTcl_Alloc\fR. -If \fIinterp->freeProc\fR is non-zero, then Tcl will call \fIfreeProc\fR -to free the space pointed to by \fIinterp->result\fR before it -invokes the next command. -If a client procedure overwrites \fIinterp->result\fR when -\fIinterp->freeProc\fR is non-zero, then it is responsible for calling -\fIfreeProc\fR to free the old \fIinterp->result\fR (the \fBTcl_FreeResult\fR -macro should be used for this purpose). -.PP -\fIFreeProc\fR should have arguments and result that match the -\fBTcl_FreeProc\fR declaration above: it receives a single -argument which is a pointer to the result value to free. -In most applications \fBTCL_DYNAMIC\fR is the only non-zero value ever -used for \fIfreeProc\fR. -However, an application may store a different procedure address -in \fIfreeProc\fR in order to use an alternate memory allocator -or in order to do other cleanup when the result memory is freed. -.PP -As part of processing each command, \fBTcl_Eval\fR initializes -\fIinterp->result\fR -and \fIinterp->freeProc\fR just before calling the command procedure for -the command. The \fIfreeProc\fR field will be initialized to zero, -and \fIinterp->result\fR will point to an empty string. Commands that -do not return any value can simply leave the fields alone. -Furthermore, the empty string pointed to by \fIresult\fR is actually -part of an array of approximately 200 characters. -If a command wishes to return a short string, it can simply copy -it to the area pointed to by \fIinterp->result\fR. Or, it can use -the sprintf procedure to generate a short result string at the location -pointed to by \fIinterp->result\fR. -.PP -It is a general convention in Tcl-based applications that the result -of an interpreter is normally in the initialized state described -in the previous paragraph. -Procedures that manipulate an interpreter's result (e.g. by -returning an error) will generally assume that the result -has been initialized when the procedure is called. -If such a procedure is to be called after the result has been -changed, then \fBTcl_ResetResult\fR should be called first to -reset the result to its initialized state. The direct use of -\fIinterp->result\fR is strongly deprecated (see \fBTcl_SetResult\fR). -.PP -The \fIerrorLine\fR -field is valid only after \fBTcl_Eval\fR returns -a \fBTCL_ERROR\fR return code. In this situation the \fIerrorLine\fR -field identifies the line number of the command being executed when -the error occurred. The line numbers are relative to the command -being executed: 1 means the first line of the command passed to -\fBTcl_Eval\fR, 2 means the second line, and so on. -The \fIerrorLine\fR field is typically used in conjunction with -\fBTcl_AddErrorInfo\fR to report information about where an error -occurred. -\fIErrorLine\fR should not normally be modified except by \fBTcl_Eval\fR. - -.SH KEYWORDS -free, initialized, interpreter, malloc, result diff --git a/doc/LinkVar.3 b/doc/LinkVar.3 index 6710702..de37938 100644 --- a/doc/LinkVar.3 +++ b/doc/LinkVar.3 @@ -96,7 +96,7 @@ Any value written into the Tcl variable must have a proper integer form acceptable to \fBTcl_GetIntFromObj\fR; attempts to write non-integer values into \fIvarName\fR will be rejected with Tcl errors. Incomplete integer representations (like the empty -string, '+', '-' or the hex/octal/binary prefix) are accepted +string, '+', '-' or the hex/octal/decimal/binary prefix) are accepted as if they are valid too. .TP \fBTCL_LINK_UINT\fR @@ -107,7 +107,7 @@ integer form acceptable to \fBTcl_GetWideIntFromObj\fR and in the platform's defined range for the \fBunsigned int\fR type; attempts to write non-integer values (or values outside the range) into \fIvarName\fR will be rejected with Tcl errors. Incomplete integer -representations (like the empty string, '+', '-' or the hex/octal/binary +representations (like the empty string, '+', '-' or the hex/octal/decimal/binary prefix) are accepted as if they are valid too. .TP \fBTCL_LINK_CHAR\fR @@ -118,7 +118,7 @@ form acceptable to \fBTcl_GetIntFromObj\fR and be in the range of the \fBchar\fR datatype; attempts to write non-integer or out-of-range values into \fIvarName\fR will be rejected with Tcl errors. Incomplete integer representations (like the empty string, '+', '-' or the -hex/octal/binary prefix) are accepted as if they are valid too. +hex/octal/decimal/binary prefix) are accepted as if they are valid too. .RS .PP .VS "TIP 312" @@ -141,7 +141,7 @@ integer form acceptable to \fBTcl_GetIntFromObj\fR and in the platform's defined range for the \fBunsigned char\fR type; attempts to write non-integer values (or values outside the range) into \fIvarName\fR will be rejected with Tcl errors. Incomplete integer -representations (like the empty string, '+', '-' or the hex/octal/binary +representations (like the empty string, '+', '-' or the hex/octal/decimal/binary prefix) are accepted as if they are valid too. .RS .PP @@ -166,7 +166,7 @@ form acceptable to \fBTcl_GetIntFromObj\fR and be in the range of the \fBshort\fR datatype; attempts to write non-integer or out-of-range values into \fIvarName\fR will be rejected with Tcl errors. Incomplete integer representations (like the empty string, '+', '-' or the -hex/octal/binary prefix) are accepted as if they are valid too. +hex/octal/decimal/binary prefix) are accepted as if they are valid too. .TP \fBTCL_LINK_USHORT\fR . @@ -176,7 +176,7 @@ integer form acceptable to \fBTcl_GetIntFromObj\fR and in the platform's defined range for the \fBunsigned short\fR type; attempts to write non-integer values (or values outside the range) into \fIvarName\fR will be rejected with Tcl errors. Incomplete integer -representations (like the empty string, '+', '-' or the hex/octal/binary +representations (like the empty string, '+', '-' or the hex/octal/decimal/binary prefix) are accepted as if they are valid too. .TP \fBTCL_LINK_LONG\fR @@ -187,7 +187,7 @@ form acceptable to \fBTcl_GetLongFromObj\fR; attempts to write non-integer or out-of-range values into \fIvarName\fR will be rejected with Tcl errors. Incomplete integer representations (like the empty string, '+', '-' or the -hex/octal/binary prefix) are accepted as if they are valid too. +hex/octal/decimal/binary prefix) are accepted as if they are valid too. .TP \fBTCL_LINK_ULONG\fR . @@ -197,7 +197,7 @@ integer form acceptable to \fBTcl_GetWideIntFromObj\fR and in the platform's defined range for the \fBunsigned long\fR type; attempts to write non-integer values (or values outside the range) into \fIvarName\fR will be rejected with Tcl errors. Incomplete integer -representations (like the empty string, '+', '-' or the hex/octal/binary +representations (like the empty string, '+', '-' or the hex/octal/decimal/binary prefix) are accepted as if they are valid too. .TP \fBTCL_LINK_DOUBLE\fR @@ -207,7 +207,7 @@ Any value written into the Tcl variable must have a proper real form acceptable to \fBTcl_GetDoubleFromObj\fR; attempts to write non-real values into \fIvarName\fR will be rejected with Tcl errors. Incomplete integer or real representations (like the -empty string, '.', '+', '-' or the hex/octal/binary prefix) are +empty string, '.', '+', '-' or the hex/octal/decimal/binary prefix) are accepted as if they are valid too. .TP \fBTCL_LINK_FLOAT\fR @@ -219,7 +219,7 @@ range acceptable for a \fBfloat\fR; attempts to write non-real values (or values outside the range) into \fIvarName\fR will be rejected with Tcl errors. Incomplete integer or real representations (like the empty string, '.', '+', '-' or -the hex/octal/binary prefix) are accepted as if they are valid too. +the hex/octal/decimal/binary prefix) are accepted as if they are valid too. .TP \fBTCL_LINK_WIDE_INT\fR . @@ -230,7 +230,7 @@ Any value written into the Tcl variable must have a proper integer form acceptable to \fBTcl_GetWideIntFromObj\fR; attempts to write non-integer values into \fIvarName\fR will be rejected with Tcl errors. Incomplete integer representations (like the empty -string, '+', '-' or the hex/octal/binary prefix) are accepted +string, '+', '-' or the hex/octal/decimal/binary prefix) are accepted as if they are valid too. .TP \fBTCL_LINK_WIDE_UINT\fR @@ -244,7 +244,7 @@ cast to unsigned); .\" FIXME! Use bignums instead. attempts to write non-integer values into \fIvarName\fR will be rejected with Tcl errors. Incomplete integer representations (like -the empty string, '+', '-' or the hex/octal/binary prefix) are accepted +the empty string, '+', '-' or the hex/octal/decimal/binary prefix) are accepted as if they are valid too. .TP \fBTCL_LINK_BOOLEAN\fR diff --git a/doc/ObjectType.3 b/doc/ObjectType.3 index 36b45e1..fb76ef7 100644 --- a/doc/ObjectType.3 +++ b/doc/ObjectType.3 @@ -85,14 +85,12 @@ unless \fIinterp\fR is NULL. Otherwise, it returns \fBTCL_OK\fR. Passing a NULL \fIinterp\fR allows this procedure to be used as a test whether the conversion can be done (and in fact was done). -.VS 8.5 .PP In many cases, the \fItypePtr->setFromAnyProc\fR routine will set \fIobjPtr->typePtr\fR to the argument value \fItypePtr\fR, but that is no longer guaranteed. The \fIsetFromAnyProc\fR is free to set the internal representation for \fIobjPtr\fR to make use of another related Tcl_ObjType, if it sees fit. -.VE 8.5 .SH "THE TCL_OBJTYPE STRUCTURE" .PP Extension writers can define new value types by defining four diff --git a/doc/Panic.3 b/doc/Panic.3 index 6c6ec28..cb4d3cb 100644 --- a/doc/Panic.3 +++ b/doc/Panic.3 @@ -50,13 +50,13 @@ In a freshly loaded Tcl library, \fBTcl_Panic\fR prints the formatted error message to the standard error file of the process, and then calls \fBabort\fR to terminate the process. \fBTcl_Panic\fR does not return. On Windows, when a debugger is running, the formatted error -message is sent to the debugger in stead. If the windows executable +message is sent to the debugger instead. If the windows executable does not have a stderr channel (e.g. \fBwish.exe\fR), then a system dialog box is used to display the panic message. .PP If your application doesn't use \fBTcl_Main\fR or \fBTk_Main\fR and you want to implicitly use the stderr channel of your -application's C runtime (in stead of the stderr channel of the +application's C runtime (instead of the stderr channel of the C runtime used by Tcl), you can call \fBTcl_SetPanicProc\fR with \fBTcl_ConsolePanic\fR as its argument. On platforms which only have one C runtime (almost all platforms except Windows) @@ -83,13 +83,15 @@ The typical use of \fBTcl_SetPanicProc\fR arranges for the error message to be displayed or reported in a manner more suitable for the application or the platform. .PP +\fBTcl_SetPanicProc\fR can not be used safely by stub-enabled extensions, so its +symbol is not included in the stub table. +.PP Although the primary callers of \fBTcl_Panic\fR are the procedures of the Tcl library, \fBTcl_Panic\fR is a public function and may be called by any extension or application that wishes to abort the process and have a panic message displayed the same way that panic messages from Tcl will be displayed. .PP -This function can not be used in stub-enabled extensions. .SH "SEE ALSO" abort(3), printf(3), exec(n), format(n) .SH KEYWORDS diff --git a/doc/SetResult.3 b/doc/SetResult.3 index 81f0264..07e2344 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. '\" -.TH Tcl_SetResult 3 8.0 Tcl "Tcl Library Procedures" +.TH Tcl_SetResult 3 8.7 Tcl "Tcl Library Procedures" .so man.macros .BS .SH NAME @@ -28,9 +28,7 @@ const char * .sp \fBTcl_ResetResult\fR(\fIinterp\fR) .sp -.VS 8.6 -\fBTcl_TransferResult\fR(\fIsourceInterp, result, targetInterp\fR) -.VE 8.6 +\fBTcl_TransferResult\fR(\fIsourceInterp, code, targetInterp\fR) .sp \fBTcl_AppendElement\fR(\fIinterp, element\fR) .sp @@ -55,18 +53,11 @@ Address of procedure to call to release storage at An argument list which must have been initialized using \fBva_start\fR, and cleared using \fBva_end\fR. .AP Tcl_Interp *sourceInterp in -.VS 8.6 -Interpreter that the result and error information should be copied from. -.VE 8.6 +Interpreter that the result and return options should be transferred from. .AP Tcl_Interp *targetInterp in -.VS 8.6 -Interpreter that the result and error information should be copied to. -.VE 8.6 -.AP int result in -.VS 8.6 -If \fBTCL_OK\fR, only copy the result. If \fBTCL_ERROR\fR, copy the error -information as well. -.VE 8.6 +Interpreter that the result and return options should be transferred to. +.AP int code in +Return code value that controls transfer of return options. .BE .SH DESCRIPTION .PP @@ -150,12 +141,14 @@ extensions. Any number of \fIresult\fR arguments may be passed in a single call; the last argument in the list must be a NULL pointer. .PP -.VS 8.6 -\fBTcl_TransferResult\fR moves a result from one interpreter to another, -optionally (dependent on the \fIresult\fR parameter) including the error -information dictionary as well. The interpreters must be in the same thread. -The source interpreter will have its result reset by this operation. -.VE 8.6 +\fBTcl_TransferResult\fR transfers interpreter state from \fIsourceInterp\fR +to \fItargetInterp\fR. The two interpreters must have been created in the +same thread. If \fIsourceInterp\fR and \fItargetInterp\fR are the same, +nothing is done. Otherwise, \fBTcl_TransferResult\fR moves the result +from \fIsourceInterp\fR to \fItargetInterp\fR, and resets the result +in \fIsourceInterp\fR. It also moves the return options dictionary as +controlled by the return code value \fIcode\fR in the same manner +as \fBTcl_GetReturnOptions\fR. .SH "DEPRECATED INTERFACES" .SS "OLD STRING PROCEDURES" .PP @@ -232,6 +225,7 @@ typedef void \fBTcl_FreeProc\fR( When \fIfreeProc\fR is called, its \fIblockPtr\fR will be set to the value of \fIresult\fR passed to \fBTcl_SetResult\fR. .SH "SEE ALSO" -Tcl_AddErrorInfo, Tcl_CreateObjCommand, Tcl_SetErrorCode, Tcl_Interp +Tcl_AddErrorInfo, Tcl_CreateObjCommand, Tcl_SetErrorCode, Tcl_Interp, +Tcl_GetReturnOptions .SH KEYWORDS append, command, element, list, value, result, return value, interpreter diff --git a/doc/StaticPkg.3 b/doc/StaticPkg.3 index 6e7e94a..a28652e 100644 --- a/doc/StaticPkg.3 +++ b/doc/StaticPkg.3 @@ -65,7 +65,8 @@ error message. The result or error from the initialization procedure will be returned as the result of the \fBload\fR command that caused the initialization procedure to be invoked. .PP -This function can not be used in stub-enabled extensions. +\fBTcl_StaticPackage\fR can not be safely used by stub-enabled extensions, +so its symbol is not included in the stub table. .SH KEYWORDS initialization procedure, package, static linking .SH "SEE ALSO" diff --git a/doc/Tcl_Main.3 b/doc/Tcl_Main.3 index 816dfeb..dc4f45f 100644 --- a/doc/Tcl_Main.3 +++ b/doc/Tcl_Main.3 @@ -190,7 +190,7 @@ procedure (if any) returns. In non-interactive mode, after procedure (if any) returns, \fBTcl_Main\fR will also evaluate the \fBexit\fR command. .PP -This function can not be used in stub-enabled extensions. +\fBTcl_Main\fR can not be used in stub-enabled extensions. .SH "SEE ALSO" tclsh(1), Tcl_GetStdChannel(3), Tcl_StandardChannels(3), Tcl_AppInit(3), exit(n), encoding(n) diff --git a/doc/catch.n b/doc/catch.n index d43a7ec..8d885d4 100644 --- a/doc/catch.n +++ b/doc/catch.n @@ -56,9 +56,7 @@ When the return code from evaluation of \fIscript\fR is \fBTCL_ERROR\fR, four additional entries are defined in the dictionary of return options stored in \fIoptionsVarName\fR: \fB\-errorinfo\fR, \fB\-errorcode\fR, \fB\-errorline\fR, and -.VS 8.6 \fB\-errorstack\fR. -.VE 8.6 The value of the \fB\-errorinfo\fR entry is a formatted stack trace containing more information about the context in which the error happened. The formatted stack trace is meant to be read by a person. The value of the @@ -67,7 +65,6 @@ list. The \fB\-errorcode\fR value is meant to be further processed by programs, and may not be particularly readable by people. The value of the \fB\-errorline\fR entry is an integer indicating which line of \fIscript\fR was being evaluated when the error occurred. -.VS 8.6 The value of the \fB\-errorstack\fR entry is an even-sized list made of token-parameter pairs accumulated while unwinding the stack. The token may be @@ -87,14 +84,11 @@ the static text of the calling sites, and .IP [3] it is coarser-grained, with only one element per stack frame (like procs; no separate elements for \fBforeach\fR constructs for example). -.VE 8.6 .PP The values of the \fB\-errorinfo\fR and \fB\-errorcode\fR entries of the most recent error are also available as values of the global variables \fB::errorInfo\fR and \fB::errorCode\fR respectively. -.VS 8.6 The value of the \fB\-errorstack\fR entry surfaces as \fBinfo errorstack\fR. -.VE 8.6 .PP Tcl packages may provide commands that set other entries in the dictionary of return options, and the \fBreturn\fR command may be @@ -35,7 +35,6 @@ turned on by default. . Close and destroy the channel called \fIchannelId\fR. Note that this deletes all existing file-events registered on the channel. -.VS 8.6 If the \fIdirection\fR argument (which must be \fBread\fR or \fBwrite\fR or any unique abbreviation of them) is present, the channel will only be half-closed, so that it can go from being read-write to write-only or @@ -45,7 +44,6 @@ write-only channels. Without the \fIdirection\fR argument, the channel is closed for both reading and writing (but only if those directions are currently open). It is an error to close a read-only channel for writing, or a write-only channel for reading. -.VE 8.6 .RS .PP As part of closing the channel, all buffered output is flushed to the @@ -83,12 +81,10 @@ an error occurs while flushing output. If a command in a command pipeline created with \fBopen\fR returns an error, \fBchan close\fR generates an error (similar to the \fBexec\fR command.) .PP -.VS 8.6 Note that half-closes of sockets and command pipelines can have important side effects because they result in a shutdown() or close() of the underlying system resource, which can change how other processes or systems respond to the Tcl program. -.VE 8.6 .RE .TP \fBchan configure \fIchannelId\fR ?\fIoptionName\fR? ?\fIvalue\fR? ?\fIoptionName value\fR?... @@ -540,7 +536,6 @@ an extremely long line that exceeds the available memory to buffer it). Returns -1 if the channel was not opened for the mode in question. .TP \fBchan pipe\fR -.VS 8.6 Creates a standalone pipe whose read- and write-side channels are returned as a 2-element list, the first element being the read side and the second the write side. Can be useful e.g. to redirect @@ -561,16 +556,13 @@ is most likely to show up when using pipelines for testing; care should be taken to ensure that deadlocks do not occur and that potential short reads are allowed for. .RE -.VE 8.6 .TP \fBchan pop \fIchannelId\fR -.VS 8.6 Removes the topmost transformation from the channel \fIchannelId\fR, if there is any. If there are no transformations added to \fIchannelId\fR, this is equivalent to \fBchan close\fR of that channel. The result is normally the empty string, but can be an error in some situations (i.e. where the underlying system stream is closed and that results in an error). -.VE 8.6 .TP \fBchan postevent \fIchannelId eventSpec\fR . @@ -609,7 +601,6 @@ executed in the interpreter that set them up. .RE .TP \fBchan push \fIchannelId cmdPrefix\fR -.VS 8.6 Adds a new transformation on top of the channel \fIchannelId\fR. The \fIcmdPrefix\fR argument describes a list of one or more words which represent a handler that will be used to implement the transformation. The command @@ -618,7 +609,6 @@ The result of this subcommand is a handle to the transformation. Note that it is important to make sure that the transformation is capable of supporting the channel mode that it is used with or this can make the channel neither readable nor writable. -.VE 8.6 .TP \fBchan puts\fR ?\fB\-nonewline\fR? ?\fIchannelId\fR? \fIstring\fR . diff --git a/doc/close.n b/doc/close.n index 5daf3e2..3d18aea 100644 --- a/doc/close.n +++ b/doc/close.n @@ -49,16 +49,13 @@ When the last interpreter in which the channel is registered invokes .PP Channels are automatically closed when an interpreter is destroyed and when the process exits. -.VS 8.6 From 8.6 on (TIP#398), nonblocking channels are no longer switched to blocking mode when exiting; this guarantees a timely exit even when the peer or a communication channel is stalled. To ensure proper flushing of stalled nonblocking channels on exit, one must now either (a) actively switch them back to blocking or (b) use the environment variable TCL_FLUSH_NONBLOCKING_ON_EXIT, which when set and not equal to "0" restores the previous behavior. -.VE 8.6 .PP The command returns an empty string, and may generate an error if an error occurs while flushing output. If a command in a command pipeline created with \fBopen\fR returns an error, \fBclose\fR generates an error (similar to the \fBexec\fR command.) .PP -.VS 8.6 The two-argument form is a .QW "half-close" : given a bidirectional channel like a @@ -80,7 +77,6 @@ abnormal exit error. .PP Currently only sockets and command pipelines support half-close. A future extension will allow reflected and stacked channels to do so. -.VE 8.6 .SH EXAMPLE .PP This illustrates how you can use Tcl to ensure that files get closed diff --git a/doc/coroutine.n b/doc/coroutine.n index a032d2e..11f9069 100644 --- a/doc/coroutine.n +++ b/doc/coroutine.n @@ -9,7 +9,7 @@ .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME -coroutine, yield, yieldto \- Create and produce values from coroutines +coroutine, yield, yieldto, coroinject, coroprobe \- Create and produce values from coroutines .SH SYNOPSIS .nf \fBcoroutine \fIname command\fR ?\fIarg...\fR? @@ -17,11 +17,9 @@ dde \- Execute a Dynamic Data Exchange command .sp \fBdde servername\fR ?\fB\-force\fR? ?\fB\-handler \fIproc\fR? ?\fB\-\|\-\fR? ?\fItopic\fR? .sp -.VS 8.6 \fBdde execute\fR ?\fB\-async\fR? ?\fB\-binary\fR? \fIservice topic data\fR .sp \fBdde poke\fR ?\fB\-binary\fR? \fIservice topic item data\fR -.VE 8.6 .sp \fBdde request\fR ?\fB\-binary\fR? \fIservice topic item\fR .sp @@ -82,13 +80,11 @@ script is run in the application. The \fB\-async\fR option requests asynchronous invocation. The command returns an error message if the script did not run, unless the \fB\-async\fR flag was used, in which case the command returns immediately with no error. -.VS 8.6 Without the \fB\-binary\fR option all data will be sent in unicode. For dde clients which don't implement the CF_UNICODE clipboard format, this will automatically be translated to the system encoding. You can use the \fB\-binary\fR option in combination with the result of \fBencoding convertto\fR to send data in any other encoding. -.VE 8.6 .TP \fBdde poke\fR ?\fB\-binary\fR? \fIservice topic item data\fR . @@ -99,13 +95,11 @@ specific but can be a command to the server or the name of a file to work on. The \fIitem\fR is also application specific and is often not used, but it must always be non-null. The \fIdata\fR field is given to the remote application. -.VS 8.6 Without the \fB\-binary\fR option all data will be sent in unicode. For dde clients which don't implement the CF_UNICODE clipboard format, this will automatically be translated to the system encoding. You can use the \fB\-binary\fR option in combination with the result of \fBencoding convertto\fR to send data in any other encoding. -.VE 8.6 .TP \fBdde request\fR ?\fB\-binary\fR? \fIservice topic item\fR . @@ -54,10 +54,8 @@ type (which may be abbreviated.) Supported filter types are: .RS .TP \fBdict filter \fIdictionaryValue \fBkey\fR ?\fIglobPattern ...\fR? -.VS 8.6 The key rule only matches those key/value pairs whose keys match any of the given patterns (in the style of \fBstring match\fR.) -.VE 8.6 .TP \fBdict filter \fIdictionaryValue \fBscript {\fIkeyVariable valueVariable\fB} \fIscript\fR . @@ -74,10 +72,8 @@ result. The key/value pairs are tested in the order in which the keys were inserted into the dictionary. .TP \fBdict filter \fIdictionaryValue \fBvalue \fR?\fIglobPattern ...\fR? -.VS 8.6 The value rule only matches those key/value pairs whose values match any of the given patterns (in the style of \fBstring match\fR.) -.VE 8.6 .RE .TP \fBdict for {\fIkeyVariable valueVariable\fB} \fIdictionaryValue body\fR @@ -338,7 +338,6 @@ if {[catch {\fBexec\fR grep foo bar.txt} results options]} { } } .CE -.VS 8.6 .PP This is more easily written using the \fBtry\fR command, as that makes it simpler to trap specific types of errors. This is @@ -352,7 +351,6 @@ try { set status [lindex [dict get $options -errorcode] 2] } .CE -.VE 8.6 .SS "WORKING WITH QUOTED ARGUMENTS" .PP When translating a command from a Unix shell invocation, care should @@ -465,7 +465,6 @@ between platforms: .TP \fBfile tempfile\fR ?\fInameVar\fR? ?\fItemplate\fR? '\" TIP #210 -.VS 8.6 Creates a temporary file and returns a read-write channel opened on that file. If the \fInameVar\fR is given, it specifies a variable that the name of the temporary file will be written into; if absent, Tcl will attempt to arrange @@ -480,7 +479,6 @@ Note that temporary files are \fIonly\fR ever created on the native filesystem. As such, they can be relied upon to be used with operating-system native APIs and external programs that require a filename. .RE -.VE 8.6 .TP \fBfile type \fIname\fR . diff --git a/doc/interp.n b/doc/interp.n index 40ab9f9..54555e3 100644 --- a/doc/interp.n +++ b/doc/interp.n @@ -154,7 +154,6 @@ what to set the interpreter's background exception handler to. See the \fBBACKGROUND EXCEPTION HANDLING\fR section for more details. .TP \fBinterp\fR \fBcancel \fR?\fB\-unwind\fR? ?\fB\-\|\-\fR? ?\fIpath\fR? ?\fIresult\fR? -.VS 8.6 Cancels the script being evaluated in the interpreter identified by \fIpath\fR. Without the \fB\-unwind\fR switch the evaluation stack for the interpreter is unwound until an enclosing catch command is found or @@ -167,7 +166,6 @@ switches; it may be needed if \fIpath\fR is an unusual value such as \fB\-safe\fR. If \fIresult\fR is present, it will be used as the error message string; otherwise, a default error message string will be used. -.VE 8.6 .TP \fBinterp\fR \fBcreate \fR?\fB\-safe\fR? ?\fB\-\|\-\fR? ?\fIpath\fR? . diff --git a/doc/lsearch.n b/doc/lsearch.n index 12c2786..9172d96 100644 --- a/doc/lsearch.n +++ b/doc/lsearch.n @@ -134,7 +134,6 @@ The list elements are sorted in increasing order. This option is only meaningful when used with \fB\-sorted\fR. .TP \fB\-bisect\fR -.VS 8.6 Inexact search when the list elements are in sorted order. For an increasing list the last index where the element is less than or equal to the pattern is returned. For a decreasing list the last index where the element is greater @@ -142,7 +141,6 @@ than or equal to the pattern is returned. If the pattern is before the first element or the list is empty, -1 is returned. This option implies \fB\-sorted\fR and cannot be used with either \fB\-all\fR or \fB\-not\fR. -.VE 8.6 .SS "NESTED LIST OPTIONS" .PP These options are used to search lists of lists. They may be used diff --git a/doc/lsort.n b/doc/lsort.n index c3245b2..17a921a 100644 --- a/doc/lsort.n +++ b/doc/lsort.n @@ -221,7 +221,6 @@ Sorting using indices: {e 1} {d 2} { c 3} {b 4} {a 5} .CE .PP -.VS 8.6 Sorting a dictionary: .PP .CS @@ -239,7 +238,6 @@ Sorting using striding and multiple indices: {{Bob Smith} 25 Audi {Jane Doe} 40 Ford} {{Jane Doe} 40 Ford {Bob Smith} 25 Audi} .CE -.VE 8.6 .PP Stripping duplicate values using sorting: .PP diff --git a/doc/namespace.n b/doc/namespace.n index b0b6e25..3196cac 100644 --- a/doc/namespace.n +++ b/doc/namespace.n @@ -788,12 +788,10 @@ name. Note that when this option is non-empty and the will be exactly those words that have mappings in the dictionary. .TP \fB\-parameters\fR -.VS 8.6 This option gives a list of named arguments (the names being used during generation of error messages) that are passed by the caller of the ensemble between the name of the ensemble and the subcommand argument. By default, it is the empty list. -.VE 8.6 .TP \fB\-prefixes\fR . @@ -943,7 +941,6 @@ Remove all imported commands from the current namespace: namespace forget {*}[namespace import] .CE .PP -.VS 8.6 Create an ensemble for simple working with numbers, using the \fB\-parameters\fR option to allow the operator to be put between the first and second arguments. @@ -959,7 +956,6 @@ and second arguments. # In use, the ensemble works like this: puts [do 1 plus [do 9 minus 7]] .CE -.VE 8.6 .SH "SEE ALSO" interp(n), upvar(n), variable(n) .SH KEYWORDS diff --git a/doc/registry.n b/doc/registry.n index ec5910c..66b2dd9 100644 --- a/doc/registry.n +++ b/doc/registry.n @@ -44,13 +44,11 @@ one of \fBHKEY_LOCAL_MACHINE\fR, \fBHKEY_USERS\fR, \fBHKEY_DYN_DATA\fR. The \fIkeypath\fR can be one or more registry key names separated by backslash (\fB\e\fR) characters. .PP -.VS 8.6 The optional \fI\-mode\fR argument indicates which registry to work with; when it is \fB\-32bit\fR the 32-bit registry will be used, and when it is \fB\-64bit\fR the 64-bit registry will be used. If this argument is omitted, the system's default registry will be the subject of the requested operation. -.VE 8.6 .PP \fIOption\fR indicates what to do with the registry key name. Any unique abbreviation for \fIoption\fR is acceptable. The valid options diff --git a/doc/return.n b/doc/return.n index ea590ea..e3d7c06 100644 --- a/doc/return.n +++ b/doc/return.n @@ -137,7 +137,6 @@ by the \fBcatch\fR command (or from the copy of that information stored in the global variable \fBerrorInfo\fR). .TP \fB\-errorstack \fIlist\fR -.VS 8.6 The \fB\-errorstack\fR option receives special treatment only when the value of the \fB\-code\fR option is \fBTCL_ERROR\fR. Then \fIlist\fR is the initial error stack, recording actual argument values passed to each proc level. The error stack will @@ -152,7 +151,6 @@ the procedure. Typically the \fIlist\fR value is supplied from the value of \fB\-errorstack\fR in a return options dictionary captured by the \fBcatch\fR command (or from the copy of that information from \fBinfo errorstack\fR). -.VE 8.6 .TP \fB\-level \fIlevel\fR . diff --git a/doc/tclvars.n b/doc/tclvars.n index 42e9212..8214473 100644 --- a/doc/tclvars.n +++ b/doc/tclvars.n @@ -322,11 +322,9 @@ The version number for the operating system running on this machine. On UNIX machines, this is the value returned by \fBuname -r\fR. .TP \fBpathSeparator\fR -.VS 8.6 '\" Defined by TIP #315 The character that should be used to \fBsplit\fR PATH-like environment variables into their corresponding list of directory names. -.VE 8.6 .TP \fBplatform\fR . diff --git a/doc/zipfs.3 b/doc/zipfs.3 index 23b9a93..348557f 100644 --- a/doc/zipfs.3 +++ b/doc/zipfs.3 @@ -83,7 +83,7 @@ example, the Tcl 8.7.2 release would be searched for in a file \fBlibtcl_8_7_2.zip\fR.) That archive, if located, is also mounted read-only. .PP On Windows, \fBTclZipfs_AppHook\fR has a slightly different signature, since -it uses WCHAR in stead of char. As a result, it requires your application to +it uses WCHAR instead of char. As a result, it requires your application to be compiled with the UNICODE preprocessor symbol defined (e.g., via the \fB-DUNICODE\fR compiler flag). .PP diff --git a/generic/tcl.decls b/generic/tcl.decls index 93f41be..34ab919 100644 --- a/generic/tcl.decls +++ b/generic/tcl.decls @@ -2274,7 +2274,7 @@ declare 606 { # TIP#307 (move results between interpreters) dkf declare 607 { - void Tcl_TransferResult(Tcl_Interp *sourceInterp, int result, + void Tcl_TransferResult(Tcl_Interp *sourceInterp, int code, Tcl_Interp *targetInterp) } diff --git a/generic/tcl.h b/generic/tcl.h index b86e772..012e72d 100644 --- a/generic/tcl.h +++ b/generic/tcl.h @@ -51,10 +51,10 @@ extern "C" { #define TCL_MAJOR_VERSION 9 #define TCL_MINOR_VERSION 0 #define TCL_RELEASE_LEVEL TCL_ALPHA_RELEASE -#define TCL_RELEASE_SERIAL 1 +#define TCL_RELEASE_SERIAL 2 #define TCL_VERSION "9.0" -#define TCL_PATCH_LEVEL "9.0a1" +#define TCL_PATCH_LEVEL "9.0a2" #if defined(RC_INVOKED) /* @@ -1559,7 +1559,7 @@ typedef struct Tcl_Filesystem { * arbitrary additional data to files in a * filesystem. */ Tcl_FSFileAttrsGetProc *fileAttrsGetProc; - /* Called by 'Tcl_FSFileAttrsGet()' and by + /* Called by 'Tcl_FSFileAttrsGet()' and by * 'file attributes'. */ Tcl_FSFileAttrsSetProc *fileAttrsSetProc; /* Called by 'Tcl_FSFileAttrsSet()' and by @@ -2003,8 +2003,10 @@ typedef void (Tcl_LimitHandlerDeleteProc) (void *clientData); * Override definitions for libtommath. */ -typedef struct mp_int mp_int; +#ifndef MP_INT_DECLARED #define MP_INT_DECLARED +typedef struct mp_int mp_int; +#endif /* *---------------------------------------------------------------------------- diff --git a/generic/tclBasic.c b/generic/tclBasic.c index 4d42d58..182ec0e 100644 --- a/generic/tclBasic.c +++ b/generic/tclBasic.c @@ -20,7 +20,7 @@ #include "tclInt.h" #include "tclOOInt.h" #include "tclCompile.h" -#include "tommath.h" +#include "tclTomMath.h" #include <math.h> #include <assert.h> @@ -1823,7 +1823,6 @@ DeleteInterpProc( * could have transferred ownership of the result string to Tcl. */ - Tcl_FreeResult(interp); Tcl_DecrRefCount(iPtr->objResultPtr); iPtr->objResultPtr = NULL; Tcl_DecrRefCount(iPtr->ecVar); @@ -7138,7 +7137,7 @@ ExprAbsFunc( } goto unChanged; } else if (l == WIDE_MIN) { - mp_init_ll(&big, l); + mp_init_i64(&big, l); goto tooLarge; } Tcl_SetObjResult(interp, Tcl_NewWideIntObj(-l)); @@ -7169,7 +7168,7 @@ ExprAbsFunc( if (mp_isneg((const mp_int *) ptr)) { Tcl_GetBignumFromObj(NULL, objv[1], &big); tooLarge: - mp_neg(&big, &big); + (void)mp_neg(&big, &big); Tcl_SetObjResult(interp, Tcl_NewBignumObj(&big)); } else { unChanged: diff --git a/generic/tclBinary.c b/generic/tclBinary.c index 9d7d3d4..745ab1f 100644 --- a/generic/tclBinary.c +++ b/generic/tclBinary.c @@ -12,7 +12,7 @@ */ #include "tclInt.h" -#include "tommath.h" +#include "tclTomMath.h" #include <math.h> #include <assert.h> @@ -2336,8 +2336,7 @@ ScanNumber( Tcl_Obj *bigObj = NULL; mp_int big; - if (mp_init(&big) == MP_OKAY) { - mp_set_ull(&big, uwvalue); + if (mp_init_u64(&big, uwvalue) == MP_OKAY) { bigObj = Tcl_NewBignumObj(&big); } return bigObj; diff --git a/generic/tclCmdMZ.c b/generic/tclCmdMZ.c index 3142d1a..07c010c 100644 --- a/generic/tclCmdMZ.c +++ b/generic/tclCmdMZ.c @@ -785,7 +785,7 @@ Tcl_RegsubObjCmd( for (idx = 0 ; idx <= info.nsubs ; idx++) { subStart = info.matches[idx].start; subEnd = info.matches[idx].end; - if ((subStart >= 0) && (subEnd >= 0)) { + if ((subStart != TCL_INDEX_NONE) && (subEnd != TCL_INDEX_NONE)) { args[idx + numParts] = Tcl_NewUnicodeObj( wstring + offset + subStart, subEnd - subStart); } else { @@ -889,7 +889,7 @@ Tcl_RegsubObjCmd( if (idx <= info.nsubs) { subStart = info.matches[idx].start; subEnd = info.matches[idx].end; - if ((subStart >= 0) && (subEnd >= 0)) { + if ((subStart != TCL_INDEX_NONE) && (subEnd != TCL_INDEX_NONE)) { Tcl_AppendUnicodeToObj(resultPtr, wstring + offset + subStart, subEnd - subStart); } diff --git a/generic/tclCompCmdsSZ.c b/generic/tclCompCmdsSZ.c index 6047f81..eda991b 100644 --- a/generic/tclCompCmdsSZ.c +++ b/generic/tclCompCmdsSZ.c @@ -694,6 +694,7 @@ TclCompileStringIsCmd( OP( LNOT); return TCL_OK; } + break; case STR_IS_DOUBLE: { int satisfied, isEmpty; diff --git a/generic/tclCompile.c b/generic/tclCompile.c index 59c5ba0..35546c3 100644 --- a/generic/tclCompile.c +++ b/generic/tclCompile.c @@ -779,7 +779,7 @@ TclSetByteCodeFromAny( #ifdef TCL_COMPILE_DEBUG if (!traceInitialized) { if (Tcl_LinkVar(interp, "tcl_traceCompile", - (char *) &tclTraceCompile, TCL_LINK_INT) != TCL_OK) { + &tclTraceCompile, TCL_LINK_INT) != TCL_OK) { Tcl_Panic("SetByteCodeFromAny: unable to create link for tcl_traceCompile variable"); } traceInitialized = 1; diff --git a/generic/tclDecls.h b/generic/tclDecls.h index c7db40b..0f1a8d8 100644 --- a/generic/tclDecls.h +++ b/generic/tclDecls.h @@ -1645,7 +1645,7 @@ EXTERN int Tcl_GetErrorLine(Tcl_Interp *interp); EXTERN void Tcl_SetErrorLine(Tcl_Interp *interp, int lineNum); /* 607 */ EXTERN void Tcl_TransferResult(Tcl_Interp *sourceInterp, - int result, Tcl_Interp *targetInterp); + int code, Tcl_Interp *targetInterp); /* 608 */ EXTERN int Tcl_InterpActive(Tcl_Interp *interp); /* 609 */ @@ -2409,7 +2409,7 @@ typedef struct TclStubs { int (*tcl_ParseArgsObjv) (Tcl_Interp *interp, const Tcl_ArgvInfo *argTable, int *objcPtr, Tcl_Obj *const *objv, Tcl_Obj ***remObjv); /* 604 */ int (*tcl_GetErrorLine) (Tcl_Interp *interp); /* 605 */ void (*tcl_SetErrorLine) (Tcl_Interp *interp, int lineNum); /* 606 */ - void (*tcl_TransferResult) (Tcl_Interp *sourceInterp, int result, Tcl_Interp *targetInterp); /* 607 */ + void (*tcl_TransferResult) (Tcl_Interp *sourceInterp, int code, Tcl_Interp *targetInterp); /* 607 */ int (*tcl_InterpActive) (Tcl_Interp *interp); /* 608 */ void (*tcl_BackgroundException) (Tcl_Interp *interp, int code); /* 609 */ int (*tcl_ZlibDeflate) (Tcl_Interp *interp, int format, Tcl_Obj *data, int level, Tcl_Obj *gzipHeaderDictObj); /* 610 */ diff --git a/generic/tclDictObj.c b/generic/tclDictObj.c index 404acdb..544a6aa 100644 --- a/generic/tclDictObj.c +++ b/generic/tclDictObj.c @@ -11,7 +11,7 @@ */ #include "tclInt.h" -#include "tommath.h" +#include "tclTomMath.h" #include <assert.h> /* diff --git a/generic/tclEncoding.c b/generic/tclEncoding.c index 237aa74..7496f83 100644 --- a/generic/tclEncoding.c +++ b/generic/tclEncoding.c @@ -622,13 +622,13 @@ TclInitEncodingSubsystem(void) type.freeProc = NULL; type.nullSize = 2; type.encodingName = "utf-16le"; - type.clientData = INT2PTR(1);; + type.clientData = INT2PTR(1); Tcl_CreateEncoding(&type); type.encodingName = "utf-16be"; type.clientData = INT2PTR(0); Tcl_CreateEncoding(&type); type.encodingName = "utf-16"; - type.clientData = INT2PTR(isLe.c);; + type.clientData = INT2PTR(isLe.c); Tcl_CreateEncoding(&type); #ifndef TCL_NO_DEPRECATED @@ -1660,7 +1660,7 @@ LoadEncodingFile( * not be created because the file contained invalid data. * * Side effects: - * See Tcl_CreateEncoding(). + * See Tcl_CreateEncoding(). * *------------------------------------------------------------------------- */ @@ -2348,18 +2348,19 @@ UtfToUtfProc( dst += Tcl_UniCharToUtf(*chPtr, dst); } else { src += TclUtfToUniChar(src, chPtr); - if ((*chPtr & 0xFC00) == 0xD800) { - /* A high surrogate character is detected, handle especially */ + if ((*chPtr | 0x7FF) == 0xDFFF) { + /* A surrogate character is detected, handle especially */ Tcl_UniChar low = *chPtr; - if (src <= srcEnd-3) { - Tcl_UtfToUniChar(src, &low); - } - if ((low & 0xFC00) != 0xDC00) { + size_t len = (src <= srcEnd-3) ? Tcl_UtfToUniChar(src, &low) : 0; + if (((low | 0x3FF) != 0xDFFF) || (*chPtr & 0x400)) { *dst++ = (char) (((*chPtr >> 12) | 0xE0) & 0xEF); *dst++ = (char) (((*chPtr >> 6) | 0x80) & 0xBF); *dst++ = (char) ((*chPtr | 0x80) & 0xBF); continue; } + src += len; + dst += Tcl_UniCharToUtf(*chPtr, dst); + *chPtr = low; } dst += Tcl_UniCharToUtf(*chPtr, dst); } diff --git a/generic/tclExecute.c b/generic/tclExecute.c index 8d13c6c..957a2e8 100644 --- a/generic/tclExecute.c +++ b/generic/tclExecute.c @@ -18,7 +18,7 @@ #include "tclInt.h" #include "tclCompile.h" #include "tclOOInt.h" -#include "tommath.h" +#include "tclTomMath.h" #include <math.h> #include <assert.h> @@ -259,12 +259,16 @@ VarHashCreateVar( switch (*pc) { \ case INST_JUMP_FALSE1: \ NEXT_INST_F(((condition)? 2 : TclGetInt1AtPtr(pc+1)), (cleanup), 0); \ + break; \ case INST_JUMP_TRUE1: \ NEXT_INST_F(((condition)? TclGetInt1AtPtr(pc+1) : 2), (cleanup), 0); \ + break; \ case INST_JUMP_FALSE4: \ NEXT_INST_F(((condition)? 5 : TclGetInt4AtPtr(pc+1)), (cleanup), 0); \ + break; \ case INST_JUMP_TRUE4: \ NEXT_INST_F(((condition)? TclGetInt4AtPtr(pc+1) : 5), (cleanup), 0); \ + break; \ default: \ if ((condition) < 0) { \ TclNewIntObj(objResultPtr, -1); \ @@ -272,6 +276,7 @@ VarHashCreateVar( objResultPtr = TCONST((condition) > 0); \ } \ NEXT_INST_F(0, (cleanup), 1); \ + break; \ } \ } while (0) #define JUMP_PEEPHOLE_V(condition, pcAdjustment, cleanup) \ @@ -280,12 +285,16 @@ VarHashCreateVar( switch (*pc) { \ case INST_JUMP_FALSE1: \ NEXT_INST_V(((condition)? 2 : TclGetInt1AtPtr(pc+1)), (cleanup), 0); \ + break; \ case INST_JUMP_TRUE1: \ NEXT_INST_V(((condition)? TclGetInt1AtPtr(pc+1) : 2), (cleanup), 0); \ + break; \ case INST_JUMP_FALSE4: \ NEXT_INST_V(((condition)? 5 : TclGetInt4AtPtr(pc+1)), (cleanup), 0); \ + break; \ case INST_JUMP_TRUE4: \ NEXT_INST_V(((condition)? TclGetInt4AtPtr(pc+1) : 5), (cleanup), 0); \ + break; \ default: \ if ((condition) < 0) { \ TclNewIntObj(objResultPtr, -1); \ @@ -293,6 +302,7 @@ VarHashCreateVar( objResultPtr = TCONST((condition) > 0); \ } \ NEXT_INST_V(0, (cleanup), 1); \ + break; \ } \ } while (0) #else /* TCL_COMPILE_DEBUG */ @@ -736,12 +746,14 @@ InitByteCodeExecution( * instruction tracing. */ { #ifdef TCL_COMPILE_DEBUG - if (Tcl_LinkVar(interp, "tcl_traceExec", (char *) &tclTraceExec, + if (Tcl_LinkVar(interp, "tcl_traceExec", &tclTraceExec, TCL_LINK_INT) != TCL_OK) { Tcl_Panic("InitByteCodeExecution: can't create link for tcl_traceExec variable"); } #endif -#ifdef TCL_COMPILE_STATS +#ifndef TCL_COMPILE_STATS + (void)interp; +#else Tcl_CreateObjCommand(interp, "evalstats", EvalStatsCmd, NULL, NULL); #endif /* TCL_COMPILE_STATS */ } @@ -1287,11 +1299,12 @@ Tcl_ExprObj( static int CopyCallback( ClientData data[], - Tcl_Interp *interp, + Tcl_Interp *dummy, int result) { Tcl_Obj **resultPtrPtr = data[0]; Tcl_Obj *resultPtr = data[1]; + (void)dummy; if (result == TCL_OK) { *resultPtrPtr = resultPtr; @@ -1486,6 +1499,8 @@ DupExprCodeInternalRep( Tcl_Obj *srcPtr, Tcl_Obj *copyPtr) { + (void)srcPtr; + (void)copyPtr; return; } @@ -2514,23 +2529,27 @@ TEBCresume( objResultPtr = codePtr->objArrayPtr[TclGetUInt4AtPtr(pc+1)]; TRACE_WITH_OBJ(("%u => ", TclGetUInt4AtPtr(pc+1)), objResultPtr); NEXT_INST_F(5, 0, 1); + break; case INST_POP: TRACE_WITH_OBJ(("=> discarding "), OBJ_AT_TOS); objPtr = POP_OBJECT(); TclDecrRefCount(objPtr); NEXT_INST_F(1, 0, 0); + break; case INST_DUP: objResultPtr = OBJ_AT_TOS; TRACE_WITH_OBJ(("=> "), objResultPtr); NEXT_INST_F(1, 0, 1); + break; case INST_OVER: opnd = TclGetUInt4AtPtr(pc+1); objResultPtr = OBJ_AT_DEPTH(opnd); TRACE_WITH_OBJ(("%u => ", opnd), objResultPtr); NEXT_INST_F(5, 0, 1); + break; case INST_REVERSE: { Tcl_Obj **a, **b; @@ -2547,6 +2566,7 @@ TEBCresume( TRACE(("%u => OK\n", opnd)); NEXT_INST_F(5, 0, 0); } + break; case INST_STR_CONCAT1: @@ -2560,6 +2580,7 @@ TEBCresume( TRACE_WITH_OBJ(("%u => ", opnd), objResultPtr); NEXT_INST_V(2, opnd, 1); + break; case INST_CONCAT_STK: /* @@ -2571,6 +2592,7 @@ TEBCresume( objResultPtr = Tcl_ConcatObj(opnd, &OBJ_AT_DEPTH(opnd-1)); TRACE_WITH_OBJ(("%u => ", opnd), objResultPtr); NEXT_INST_V(5, opnd, 1); + break; case INST_EXPAND_START: /* @@ -2592,6 +2614,7 @@ TEBCresume( PUSH_TAUX_OBJ(objPtr); TRACE(("=> mark depth as %d\n", (int) CURR_DEPTH)); NEXT_INST_F(1, 0, 0); + break; case INST_EXPAND_DROP: /* @@ -2670,6 +2693,7 @@ TEBCresume( Tcl_DecrRefCount(objPtr); NEXT_INST_F(5, 0, 0); } + break; case INST_EXPR_STK: { ByteCode *newCodePtr; @@ -2717,6 +2741,7 @@ TEBCresume( TclNewObj(objResultPtr); NEXT_INST_F(1, 0, 1); + break; case INST_INVOKE_STK4: objc = TclGetUInt4AtPtr(pc+1); @@ -3860,6 +3885,7 @@ TEBCresume( TRACE_ERROR(interp); goto gotError; } + break; /* * End of INST_UNSET instructions. @@ -4077,6 +4103,7 @@ TEBCresume( TRACE_APPEND(("link made\n")); NEXT_INST_F(5, 1, 0); } + break; /* * End of variable linking instructions. @@ -4088,6 +4115,7 @@ TEBCresume( TRACE(("%d => new pc %u\n", opnd, (unsigned)(pc + opnd - codePtr->codeStart))); NEXT_INST_F(opnd, 0, 0); + break; case INST_JUMP4: opnd = TclGetInt4AtPtr(pc+1); @@ -4150,6 +4178,7 @@ TEBCresume( #endif NEXT_INST_F(jmpOffset[b], 1, 0); } + break; case INST_JUMP_TABLE: { Tcl_HashEntry *hPtr; @@ -4175,6 +4204,7 @@ TEBCresume( NEXT_INST_F(5, 1, 0); } } + break; /* * ----------------------------------------------------------------- @@ -4193,6 +4223,7 @@ TEBCresume( TRACE_WITH_OBJ(("=> "), objResultPtr); NEXT_INST_F(1, 0, 1); } + break; case INST_COROUTINE_NAME: { CoroutineData *corPtr = iPtr->execEnvPtr->corPtr; @@ -4204,10 +4235,12 @@ TEBCresume( TRACE_WITH_OBJ(("=> "), objResultPtr); NEXT_INST_F(1, 0, 1); } + break; case INST_INFO_LEVEL_NUM: TclNewIntObj(objResultPtr, iPtr->varFramePtr->level); TRACE_WITH_OBJ(("=> "), objResultPtr); NEXT_INST_F(1, 0, 1); + break; case INST_INFO_LEVEL_ARGS: { int level; CallFrame *framePtr = iPtr->varFramePtr; @@ -5630,6 +5663,7 @@ TEBCresume( wResult = w1 - w2*wResult; goto wideResultOfArithmetic; } + break; case INST_RSHIFT: if (w2 < 0) { @@ -5678,6 +5712,7 @@ TEBCresume( wResult = w1 >> ((int) w2); goto wideResultOfArithmetic; } + break; case INST_LSHIFT: if (w2 < 0) { @@ -5867,6 +5902,7 @@ TEBCresume( TclSetIntObj(valuePtr, wResult); TRACE(("%s\n", O2S(valuePtr))); NEXT_INST_F(1, 1, 0); + break; case INST_DIV: if (w2 == 0) { @@ -6006,6 +6042,7 @@ TEBCresume( /* -NaN => NaN */ TRACE_APPEND(("%s\n", O2S(valuePtr))); NEXT_INST_F(1, 0, 0); + break; case TCL_NUMBER_INT: w1 = *((const Tcl_WideInt *) ptr1); if (w1 != WIDE_MIN) { @@ -6114,6 +6151,7 @@ TEBCresume( TRACE_APPEND(("numeric, same Tcl_Obj\n")); NEXT_INST_F(1, 0, 0); } + break; /* * End of numeric operator instructions. @@ -6130,6 +6168,7 @@ TEBCresume( } TRACE_WITH_OBJ(("\"%.30s\" => ", O2S(valuePtr)), objResultPtr); NEXT_INST_F(1, 0, 1); + break; case INST_BREAK: /* @@ -6347,6 +6386,7 @@ TEBCresume( Tcl_ListObjAppendElement(NULL, objPtr, OBJ_AT_TOS); NEXT_INST_F(1, 1, 0); } + break; case INST_BEGIN_CATCH4: /* @@ -6360,6 +6400,7 @@ TEBCresume( TclGetUInt4AtPtr(pc+1), (int) (catchTop - initCatchTop - 1), (int) CURR_DEPTH)); NEXT_INST_F(5, 0, 0); + break; case INST_END_CATCH: catchTop--; @@ -6369,6 +6410,7 @@ TEBCresume( result = TCL_OK; TRACE(("=> catchTop=%d\n", (int) (catchTop - initCatchTop - 1))); NEXT_INST_F(1, 0, 0); + break; case INST_PUSH_RESULT: objResultPtr = Tcl_GetObjResult(interp); @@ -6382,11 +6424,13 @@ TEBCresume( Tcl_IncrRefCount(objPtr); iPtr->objResultPtr = objPtr; NEXT_INST_F(1, 0, -1); + break; case INST_PUSH_RETURN_CODE: TclNewIntObj(objResultPtr, result); TRACE(("=> %u\n", result)); NEXT_INST_F(1, 0, 1); + break; case INST_PUSH_RETURN_OPTIONS: DECACHE_STACK_INFO(); @@ -6394,6 +6438,7 @@ TEBCresume( CACHE_STACK_INFO(); TRACE_WITH_OBJ(("=> "), objResultPtr); NEXT_INST_F(1, 0, 1); + break; case INST_RETURN_CODE_BRANCH: { int code; @@ -6433,6 +6478,7 @@ TEBCresume( } TRACE_APPEND(("OK\n")); NEXT_INST_F(1, 1, 0); + break; case INST_DICT_EXISTS: { int found; @@ -7056,6 +7102,7 @@ TEBCresume( TRACE_APPEND(("OK\n")); NEXT_INST_F(5, 2, 0); } + break; /* * End of dictionary-related instructions. @@ -7093,6 +7140,7 @@ TEBCresume( TRACE_WITH_OBJ(("=> "), objResultPtr); NEXT_INST_F(2, 0, 1); } + break; default: Tcl_Panic("TclNRExecuteByteCode: unrecognized opCode %u", *pc); @@ -7702,7 +7750,7 @@ ExecuteExtendedBinaryMathOp( * Arguments are opposite sign; remainder is sum. */ - mp_init_ll(&big1, w1); + mp_init_i64(&big1, w1); mp_add(&big2, &big1, &big2); mp_clear(&big1); BIG_RESULT(&big2); @@ -7720,7 +7768,7 @@ ExecuteExtendedBinaryMathOp( mp_init(&bigResult); mp_init(&bigRemainder); mp_div(&big1, &big2, &bigResult, &bigRemainder); - if ((bigRemainder.used != 0) && (bigRemainder.sign != big2.sign)) { + if (!mp_iszero(&bigRemainder) && (bigRemainder.sign != big2.sign)) { /* * Convert to Tcl's integer division rules. */ @@ -7951,7 +7999,7 @@ ExecuteExtendedBinaryMathOp( Tcl_TakeBignumFromObj(NULL, value2Ptr, &big2); negativeExponent = mp_isneg(&big2); mp_mod_2d(&big2, 1, &big2); - oddExponent = big2.used != 0; + oddExponent = !mp_iszero(&big2); mp_clear(&big2); } @@ -8268,7 +8316,7 @@ ExecuteExtendedBinaryMathOp( mp_mul(&big1, &big2, &bigResult); break; case INST_DIV: - if (big2.used == 0) { + if (mp_iszero(&big2)) { mp_clear(&big1); mp_clear(&big2); mp_clear(&bigResult); @@ -8277,7 +8325,7 @@ ExecuteExtendedBinaryMathOp( mp_init(&bigRemainder); mp_div(&big1, &big2, &bigResult, &bigRemainder); /* TODO: internals intrusion */ - if ((bigRemainder.used != 0) + if (!mp_iszero(&bigRemainder) && (bigRemainder.sign != big2.sign)) { /* * Convert to Tcl's integer division rules. @@ -8319,7 +8367,7 @@ ExecuteExtendedUnaryMathOp( } Tcl_TakeBignumFromObj(NULL, valuePtr, &big); /* ~a = - a - 1 */ - mp_neg(&big, &big); + (void)mp_neg(&big, &big); mp_sub_d(&big, 1, &big); BIG_RESULT(&big); case INST_UMINUS: @@ -8331,12 +8379,12 @@ ExecuteExtendedUnaryMathOp( if (w != WIDE_MIN) { WIDE_RESULT(-w); } - mp_init_ll(&big, w); + mp_init_i64(&big, w); break; default: Tcl_TakeBignumFromObj(NULL, valuePtr, &big); } - mp_neg(&big, &big); + (void)mp_neg(&big, &big); BIG_RESULT(&big); } @@ -8432,6 +8480,7 @@ TclCompareTwoNumbers( mp_clear(&big2); return compare; } + break; case TCL_NUMBER_DOUBLE: d1 = *((const double *)ptr1); @@ -8478,6 +8527,7 @@ TclCompareTwoNumbers( Tcl_InitBignumFromDouble(NULL, d1, &big1); goto bigCompare; } + break; case TCL_NUMBER_BIG: Tcl_TakeBignumFromObj(NULL, valuePtr, &big1); @@ -8514,10 +8564,11 @@ TclCompareTwoNumbers( mp_clear(&big2); return compare; } + break; default: Tcl_Panic("unexpected number type"); - return TCL_ERROR; } + return TCL_ERROR; } #ifdef TCL_COMPILE_DEBUG @@ -8685,12 +8736,12 @@ IllegalExprOperandType( ClientData ptr; int type; const unsigned char opcode = *pc; - const char *description, *operator = "unknown"; + const char *description, *op = "unknown"; if (opcode == INST_EXPON) { - operator = "**"; + op = "**"; } else if (opcode <= INST_LNOT) { - operator = operatorStrings[opcode - INST_BITOR]; + op = operatorStrings[opcode - INST_BITOR]; } if (GetNumberFromObj(NULL, opndPtr, &ptr, &type) != TCL_OK) { @@ -8706,7 +8757,7 @@ IllegalExprOperandType( Tcl_SetObjResult(interp, Tcl_ObjPrintf( "can't use %s \"%s\" as operand of \"%s\"", description, - TclGetString(opndPtr), operator)); + TclGetString(opndPtr), op)); Tcl_SetErrorCode(interp, "ARITH", "DOMAIN", description, NULL); } diff --git a/generic/tclIO.c b/generic/tclIO.c index 88bbc43..d3b9bbb 100644 --- a/generic/tclIO.c +++ b/generic/tclIO.c @@ -4714,8 +4714,8 @@ Tcl_GetsObj( * Skip the raw bytes that make up the '\n'. */ - char tmp[TCL_UTF_MAX]; int rawRead; + char tmp[TCL_UTF_MAX]; bufPtr = gs.bufPtr; Tcl_ExternalToUtf(NULL, gs.encoding, RemovePoint(bufPtr), @@ -6269,8 +6269,8 @@ ReadChars( */ if (code != TCL_OK) { - char buffer[TCL_UTF_MAX + 1]; int read, decoded, count; + char buffer[TCL_UTF_MAX + 1]; /* * Didn't get everything the buffer could offer diff --git a/generic/tclIOUtil.c b/generic/tclIOUtil.c index 91b4ab3..d8ba787 100644 --- a/generic/tclIOUtil.c +++ b/generic/tclIOUtil.c @@ -171,7 +171,7 @@ const Tcl_Filesystem tclNativeFilesystem = { TclpObjCopyDirectory, TclpObjLstat, /* Needs casts since we're using version_2. */ - (Tcl_FSLoadFileProc *) TclpDlopen, + (Tcl_FSLoadFileProc *)(void *) TclpDlopen, (Tcl_FSGetCwdProc *) TclpGetNativeCwd, TclpObjChdir }; @@ -620,7 +620,7 @@ FsGetFirstFilesystem(void) } /* - * The epoch can is changed when a filesystems is added or removed, when + * The epoch can is changed when a filesystems is added or removed, when * "system encoding" changes, and when env(HOME) changes. */ @@ -959,7 +959,7 @@ Tcl_FSUnregister( * Search in the given pathname for files matching the given pattern. * Used by [glob]. Processes just one pattern for one directory. Callers * such as TclGlob and DoGlob implement manage the searching of multiple - * directories in cases such as + * directories in cases such as * glob -dir $dir -join * pkgIndex.tcl * * Results: @@ -1222,7 +1222,7 @@ FsAddMountsToGlobResult( * * The reason for the exception in 2,3 for the native filesystem is that * the native filesystem claims every file without determining whether - * whether the file exists, or even whether the pathname makes sense. + * whether the file exists, or even whether the pathname makes sense. * *---------------------------------------------------------------------- */ @@ -1240,7 +1240,7 @@ Tcl_FSMountsChanged( /* * Increment the filesystem epoch to invalidate every existing cached - * internal representation. + * internal representation. */ Tcl_MutexLock(&filesystemMutex); @@ -1475,7 +1475,7 @@ TclGetOpenModeEx( const char *modeString, /* Mode string, e.g. "r+" or "RDONLY CREAT" */ int *seekFlagPtr, /* Sets this to 1 to tell the the caller to seek to * EOF after opening the file, and 0 otherwise. */ - int *binaryPtr) /* Sets this to 1 to tell the caller to + int *binaryPtr) /* Sets this to 1 to tell the caller to * configure the channel for binary * operations after opening the file. */ { @@ -1719,7 +1719,7 @@ Tcl_FSEvalFileEx( } /* - * The eof character is \32 (^Z). This is standard on Windows, and Tcl + * The eof character is \32 (^Z). This is standard on Windows, and Tcl * uses it on every platform to allow for scripted documents. [Bug: 2040] */ @@ -1855,7 +1855,7 @@ TclNREvalFile( TclPkgFileSeen(interp, TclGetString(pathPtr)); /* - * The eof character is \32 (^Z). This is standard on Windows, and Tcl + * The eof character is \32 (^Z). This is standard on Windows, and Tcl * uses it on every platform to allow for scripted documents. [Bug: 2040] */ @@ -2065,7 +2065,7 @@ Tcl_PosixError( *---------------------------------------------------------------------- * * Tcl_FSStat -- - * Calls 'statProc' of the filesystem corresponding to pathPtr. + * Calls 'statProc' of the filesystem corresponding to pathPtr. * * Replaces the standard library routines stat. * @@ -2099,7 +2099,7 @@ Tcl_FSStat( *---------------------------------------------------------------------- * * Tcl_FSLstat -- - * Calls the 'lstatProc' of the filesystem corresponding to pathPtr. + * Calls the 'lstatProc' of the filesystem corresponding to pathPtr. * * Replaces the library version of lstat. If the filesystem doesn't * provide lstatProc but does provide statProc, Tcl falls back to @@ -2199,7 +2199,7 @@ Tcl_FSOpenFileChannel( if (Tcl_FSGetNormalizedPath(interp, pathPtr) == NULL) { /* - * Return the correct error message. + * Return the correct error message. */ return NULL; } @@ -2651,7 +2651,7 @@ Tcl_FSGetCwd( norm = TclFSNormalizeAbsolutePath(interp,retVal); if (norm != NULL) { /* - * Assign to global storage the pathname of the current directory + * Assign to global storage the pathname of the current directory * and copy it into thread-local storage as well. * * At system startup multiple threads could in principle @@ -2954,7 +2954,7 @@ Tcl_FSChdir( */ FsUpdateCwd(normDirName, cd); - } + } } else { /* * Tcl_FSGetCwd() synchronizes the file-global cwdPathPtr if @@ -3018,7 +3018,7 @@ Tcl_FSLoadFile( /* Places to store pointers to the functions * named by sym1 and sym2. */ Tcl_LoadHandle *handlePtr, /* A place to store the token for the loaded - * object. Can be passed to + * object. Can be passed to * (*unloadProcPtr)() to unload the file. */ Tcl_FSUnloadFileProc **unloadProcPtr) /* A place to store a pointer to the function @@ -3050,7 +3050,7 @@ Tcl_FSLoadFile( * * Load a dynamic shared object by calling 'loadFileProc' of the * filesystem corresponding to the given pathname, and then finds within - * the loaded object the functions named in symbols[]. + * the loaded object the functions named in symbols[]. * * The given pathname is passed unmodified to `loadFileProc`, which * decides how to resolve it. On POSIX systems the native filesystem @@ -3177,7 +3177,7 @@ Tcl_LoadFile( } if (fsPtr->loadFileProc != NULL) { - int retVal = ((Tcl_FSLoadFileProc2 *)(fsPtr->loadFileProc)) + int retVal = ((Tcl_FSLoadFileProc2 *)(void *)(fsPtr->loadFileProc)) (interp, pathPtr, handlePtr, &unloadProcPtr, flags); if (retVal == TCL_OK) { @@ -3195,7 +3195,7 @@ Tcl_LoadFile( } /* - * The filesystem doesn't support 'load'. Fall to the following: + * The filesystem doesn't support 'load'. Fall to the following: */ /* @@ -3378,7 +3378,7 @@ Tcl_LoadFile( /* * This is the filesystem for the temporary file the object was loaded * from. A reference to copyToPtr is already stored in - * tvdlPtr->divertedFile, so need need to increment the refCount again. + * tvdlPtr->divertedFile, so need need to increment the refCount again. */ tvdlPtr->divertedFilesystem = copyFsPtr; @@ -3721,7 +3721,7 @@ TclFSUnloadTempFile( Tcl_Obj * Tcl_FSLink( Tcl_Obj *pathPtr, /* Pathaname of file. */ - Tcl_Obj *toPtr, /* + Tcl_Obj *toPtr, /* * NULL or the pathname of a file to link to. */ int linkAction) /* Action to perform. */ @@ -3804,7 +3804,7 @@ Tcl_FSListVolumes(void) * * FsListMounts -- * - * Lists the mounts mathing the given pattern in the given directory. + * Lists the mounts mathing the given pattern in the given directory. * * Results: * A list, having a refCount of 0, of the matching mounts, or NULL if no @@ -4209,7 +4209,7 @@ Tcl_FSCopyFile( * TclCrossFilesystemCopy -- * * Helper for Tcl_FSCopyFile and Tcl_FSLoadFile. Copies a file from one - * filesystem to another, overwiting any file that already exists. + * filesystem to another, overwiting any file that already exists. * * Results: * A standard Tcl return code. @@ -4514,7 +4514,7 @@ Tcl_FSGetFileSystemForPath( /* * Call each of the "pathInFilesystem" functions in succession until the * corresponding filesystem is found. - */ + */ for (; fsRecPtr!=NULL ; fsRecPtr=fsRecPtr->nextPtr) { ClientData clientData = NULL; diff --git a/generic/tclInt.decls b/generic/tclInt.decls index bcdea6c..8b1b3a6 100644 --- a/generic/tclInt.decls +++ b/generic/tclInt.decls @@ -215,10 +215,11 @@ declare 46 { # Tcl_Obj *TclIncrVar2(Tcl_Interp *interp, Tcl_Obj *part1Ptr, # Tcl_Obj *part2Ptr, long incrAmount, int part1NotParsed) #} -declare 50 { - void TclInitCompiledLocals(Tcl_Interp *interp, CallFrame *framePtr, - Namespace *nsPtr) -} +# Removed in 9.0: +#declare 50 { +# void TclInitCompiledLocals(Tcl_Interp *interp, CallFrame *framePtr, +# Namespace *nsPtr) +#} declare 51 { int TclInterpInit(Tcl_Interp *interp) } diff --git a/generic/tclInt.h b/generic/tclInt.h index c75fd52..ecfe847 100644 --- a/generic/tclInt.h +++ b/generic/tclInt.h @@ -5028,7 +5028,6 @@ typedef struct NRE_callback { #include "tclIntDecls.h" #include "tclIntPlatDecls.h" -#include "tclTomMathDecls.h" #if !defined(USE_TCL_STUBS) && !defined(TCL_MEM_DEBUG) #define Tcl_AttemptAlloc TclpAlloc diff --git a/generic/tclIntDecls.h b/generic/tclIntDecls.h index 260ef3e..580c959 100644 --- a/generic/tclIntDecls.h +++ b/generic/tclIntDecls.h @@ -142,9 +142,7 @@ EXTERN int TclInExit(void); /* Slot 47 is reserved */ /* Slot 48 is reserved */ /* Slot 49 is reserved */ -/* 50 */ -EXTERN void TclInitCompiledLocals(Tcl_Interp *interp, - CallFrame *framePtr, Namespace *nsPtr); +/* Slot 50 is reserved */ /* 51 */ EXTERN int TclInterpInit(Tcl_Interp *interp); /* Slot 52 is reserved */ @@ -638,7 +636,7 @@ typedef struct TclIntStubs { void (*reserved47)(void); void (*reserved48)(void); void (*reserved49)(void); - void (*tclInitCompiledLocals) (Tcl_Interp *interp, CallFrame *framePtr, Namespace *nsPtr); /* 50 */ + void (*reserved50)(void); int (*tclInterpInit) (Tcl_Interp *interp); /* 51 */ void (*reserved52)(void); int (*tclInvokeObjectCommand) (void *clientData, Tcl_Interp *interp, int argc, const char **argv); /* 53 */ @@ -937,8 +935,7 @@ extern const TclIntStubs *tclIntStubsPtr; /* Slot 47 is reserved */ /* Slot 48 is reserved */ /* Slot 49 is reserved */ -#define TclInitCompiledLocals \ - (tclIntStubsPtr->tclInitCompiledLocals) /* 50 */ +/* Slot 50 is reserved */ #define TclInterpInit \ (tclIntStubsPtr->tclInterpInit) /* 51 */ /* Slot 52 is reserved */ diff --git a/generic/tclInterp.c b/generic/tclInterp.c index e37c0bd..71c27a9 100644 --- a/generic/tclInterp.c +++ b/generic/tclInterp.c @@ -525,7 +525,7 @@ TclInterpInit( static void InterpInfoDeleteProc( - ClientData clientData, /* Ignored. */ + ClientData dummy, /* Ignored. */ Tcl_Interp *interp) /* Interp being deleted. All commands for * slave interps should already be deleted. */ { @@ -533,6 +533,7 @@ InterpInfoDeleteProc( Slave *slavePtr; Master *masterPtr; Target *targetPtr; + (void)dummy; interpInfoPtr = (InterpInfo *) ((Interp *) interp)->interpInfo; @@ -614,7 +615,7 @@ Tcl_InterpObjCmd( static int NRInterpCmd( - ClientData clientData, /* Unused. */ + ClientData dummy, /* Unused. */ Tcl_Interp *interp, /* Current interpreter. */ int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ @@ -638,6 +639,7 @@ NRInterpCmd( OPT_INVOKEHID, OPT_LIMIT, OPT_MARKTRUSTED,OPT_RECLIMIT, OPT_SLAVES, OPT_SHARE, OPT_TARGET, OPT_TRANSFER }; + (void)dummy; if (objc < 2) { Tcl_WrongNumArgs(interp, 1, objv, "cmd ?arg ...?"); @@ -999,6 +1001,7 @@ NRInterpCmd( return SlaveTimeLimitCmd(interp, slaveInterp, 4, objc, objv); } } + break; case OPT_MARKTRUSTED: if (objc != 3) { Tcl_WrongNumArgs(interp, 2, objv, "path"); @@ -2707,6 +2710,7 @@ NRSlaveCmd( return SlaveTimeLimitCmd(interp, slaveInterp, 3, objc, objv); } } + break; case OPT_MARKTRUSTED: if (objc != 2) { Tcl_WrongNumArgs(interp, 2, objv, NULL); @@ -4235,10 +4239,11 @@ DeleteScriptLimitCallback( static void CallScriptLimitCallback( ClientData clientData, - Tcl_Interp *interp) /* Interpreter which failed the limit */ + Tcl_Interp *dummy) /* Interpreter which failed the limit */ { ScriptLimitCallback *limitCBPtr = clientData; int code; + (void)dummy; if (Tcl_InterpDeleted(limitCBPtr->interp)) { return; diff --git a/generic/tclLink.c b/generic/tclLink.c index 73eee2d..4476f73 100644 --- a/generic/tclLink.c +++ b/generic/tclLink.c @@ -16,7 +16,7 @@ */ #include "tclInt.h" -#include "tommath.h" +#include "tclTomMath.h" #include <math.h> /* @@ -261,6 +261,14 @@ Tcl_LinkArray( linkPtr = Tcl_Alloc(sizeof(Link)); linkPtr->type = type & ~TCL_LINK_READ_ONLY; +#if !defined(TCL_NO_DEPRECATED) && (defined(TCL_WIDE_INT_IS_LONG) \ + || defined(_WIN32) || defined(__CYGWIN__)) + if (linkPtr->type == 11 /* legacy TCL_LINK_LONG */) { + linkPtr->type = TCL_LINK_LONG; + } else if (linkPtr->type == 12 /* legacy TCL_LINK_ULONG */) { + linkPtr->type = TCL_LINK_ULONG; + } +#endif linkPtr->numElems = size; if (type & TCL_LINK_READ_ONLY) { linkPtr->flags = LINK_READ_ONLY; diff --git a/generic/tclMain.c b/generic/tclMain.c index e2389b0..8b1ee3e 100644 --- a/generic/tclMain.c +++ b/generic/tclMain.c @@ -446,7 +446,7 @@ Tcl_MainEx( * Get a new value for tty if anyone writes to ::tcl_interactive */ - Tcl_LinkVar(interp, "tcl_interactive", (char *) &is.tty, TCL_LINK_BOOLEAN); + Tcl_LinkVar(interp, "tcl_interactive", &is.tty, TCL_LINK_BOOLEAN); is.input = Tcl_GetStdChannel(TCL_STDIN); while ((is.input != NULL) && !Tcl_InterpDeleted(interp)) { mainLoopProc = TclGetMainLoop(); diff --git a/generic/tclOOCall.c b/generic/tclOOCall.c index e13ba7f..fe4436a 100644 --- a/generic/tclOOCall.c +++ b/generic/tclOOCall.c @@ -1677,6 +1677,7 @@ AddPrivatesFromClassChainToCallContext( return 1; } } + /* FALLTHRU */ case 0: return 0; } @@ -1768,6 +1769,7 @@ AddSimpleClassChainToCallContext( privateDanger |= AddSimpleClassChainToCallContext(superPtr, methodNameObj, cbPtr, doneFilters, flags, filterDecl); } + /* FALLTHRU */ case 0: return privateDanger; } diff --git a/generic/tclObj.c b/generic/tclObj.c index 02203b0..b27260a 100644 --- a/generic/tclObj.c +++ b/generic/tclObj.c @@ -15,7 +15,7 @@ */ #include "tclInt.h" -#include "tommath.h" +#include "tclTomMath.h" #include <math.h> #include <assert.h> @@ -3156,7 +3156,7 @@ GetBignumFromObj( return TCL_OK; } if (objPtr->typePtr == &tclIntType) { - mp_init_ll(bignumValue, + mp_init_i64(bignumValue, objPtr->internalRep.wideValue); return TCL_OK; } diff --git a/generic/tclParse.c b/generic/tclParse.c index befe208..b5fa16d 100644 --- a/generic/tclParse.c +++ b/generic/tclParse.c @@ -817,7 +817,7 @@ TclParseBackslash( count = 2; switch (*p) { /* - * Note: in the conversions below, use absolute values (e.g., 0xa) + * Note: in the conversions below, use absolute values (e.g., 0xA) * rather than symbolic values (e.g. \n) that get converted by the * compiler. It's possible that compilers on some platforms will do * the symbolic conversions differently, which could result in @@ -831,19 +831,19 @@ TclParseBackslash( result = 0x8; break; case 'f': - result = 0xc; + result = 0xC; break; case 'n': - result = 0xa; + result = 0xA; break; case 'r': - result = 0xd; + result = 0xD; break; case 't': result = 0x9; break; case 'v': - result = 0xb; + result = 0xB; break; case 'x': count += TclParseHex(p+1, (numBytes > 3) ? 2 : numBytes-2, &result); @@ -867,6 +867,16 @@ TclParseBackslash( * No hexdigits -> This is just "u". */ result = 'u'; + } else if (((result & 0xDC00) == 0xD800) && (count == 6) + && (p[5] == '\\') && (p[6] == 'u') && (numBytes >= 10)) { + /* If high surrogate is immediately followed by a low surrogate + * escape, combine them into one character. */ + int low; + int count2 = TclParseHex(p+7, 4, &low); + if ((count2 == 4) && ((low & 0xDC00) == 0xDC00)) { + result = ((result & 0x3FF)<<10 | (low & 0x3FF)) + 0x10000; + count += count2 + 2; + } } break; case 'U': @@ -876,6 +886,9 @@ TclParseBackslash( * No hexdigits -> This is just "U". */ result = 'U'; + } else if ((result | 0x7FF) == 0xDFFF) { + /* Upper or lower surrogate, not allowed in this syntax. */ + result = 0xFFFD; } break; case '\n': diff --git a/generic/tclPathObj.c b/generic/tclPathObj.c index b8fc428..dd78362 100644 --- a/generic/tclPathObj.c +++ b/generic/tclPathObj.c @@ -47,7 +47,7 @@ static const Tcl_ObjType fsPathType = { /* * struct FsPath -- * - * Internal representation of a Tcl_Obj of fsPathType + * Internal representation of a Tcl_Obj of fsPathType */ typedef struct { @@ -124,7 +124,7 @@ typedef struct { * None (beyond the memory allocation for the result). * * Special note: - * Originally based on code from Matt Newman and Jean-Claude Wippler. + * Originally based on code from Matt Newman and Jean-Claude Wippler. * Totally rewritten later by Vince Darley to handle symbolic links. * *--------------------------------------------------------------------------- @@ -2028,7 +2028,7 @@ Tcl_FSGetInternalRep( * * TclFSEnsureEpochOk -- * - * Ensure that the path is a valid path, and that it has a + * Ensure that the path is a valid path, and that it has a * fsPathType internal representation that is not stale. * * Results: diff --git a/generic/tclProc.c b/generic/tclProc.c index ee57865..7aa553c 100644 --- a/generic/tclProc.c +++ b/generic/tclProc.c @@ -1099,54 +1099,6 @@ ProcWrongNumArgs( /* *---------------------------------------------------------------------- * - * TclInitCompiledLocals -- - * - * This routine is invoked in order to initialize the compiled locals - * table for a new call frame. - * - * DEPRECATED: functionality has been inlined elsewhere; this function - * remains to insure binary compatibility with Itcl. - * - * Results: - * None. - * - * Side effects: - * May invoke various name resolvers in order to determine which - * variables are being referenced at runtime. - * - *---------------------------------------------------------------------- - */ - -void -TclInitCompiledLocals( - Tcl_Interp *interp, /* Current interpreter. */ - CallFrame *framePtr, /* Call frame to initialize. */ - Namespace *nsPtr) /* Pointer to current namespace. */ -{ - Var *varPtr = framePtr->compiledLocals; - Tcl_Obj *bodyPtr; - ByteCode *codePtr; - - bodyPtr = framePtr->procPtr->bodyPtr; - ByteCodeGetIntRep(bodyPtr, &tclByteCodeType, codePtr); - if (codePtr == NULL) { - Tcl_Panic("body object for proc attached to frame is not a byte code type"); - } - - if (framePtr->numCompiledLocals) { - if (!codePtr->localCachePtr) { - InitLocalCache(framePtr->procPtr) ; - } - framePtr->localCachePtr = codePtr->localCachePtr; - framePtr->localCachePtr->refCount++; - } - - InitResolvedLocals(interp, codePtr, varPtr, nsPtr); -} - -/* - *---------------------------------------------------------------------- - * * InitResolvedLocals -- * * This routine is invoked in order to initialize the compiled locals diff --git a/generic/tclResult.c b/generic/tclResult.c index aa2bad7..3ca3c7b 100644 --- a/generic/tclResult.c +++ b/generic/tclResult.c @@ -1155,22 +1155,14 @@ Tcl_SetReturnOptions( * * Tcl_TransferResult -- * - * Copy the result (and error information) from one interp to another. + * Transfer the result (and error information) from one interp to another. * Used when one interp has caused another interp to evaluate a script * and then wants to transfer the results back to itself. * - * This routine copies the string reps of the result and error - * information. It does not simply increment the refcounts of the result - * and error information objects themselves. It is not legal to exchange - * objects between interps, because an object may be kept alive by one - * interp, but have an internal rep that is only valid while some other - * interp is alive. - * * Results: - * The target interp's result is set to a copy of the source interp's - * result. The source's errorInfo field may be transferred to the - * target's errorInfo field, and the source's errorCode field may be - * transferred to the target's errorCode field. + * The result of targetInterp is set to the result read from sourceInterp. + * The return options dictionary of sourceInterp is transferred to + * targetInterp as appropriate for the return code value code. * * Side effects: * None. @@ -1180,14 +1172,16 @@ Tcl_SetReturnOptions( void Tcl_TransferResult( - Tcl_Interp *sourceInterp, /* Interp whose result and error information + Tcl_Interp *sourceInterp, /* Interp whose result and return options * should be moved to the target interp. * After moving result, this interp's result * is reset. */ - int result, /* TCL_OK if just the result should be copied, - * TCL_ERROR if both the result and error - * information should be copied. */ - Tcl_Interp *targetInterp) /* Interp where result and error information + int code, /* The return code value active in + * sourceInterp. Controls how the return options + * dictionary is retrieved from sourceInterp, + * same as in Tcl_GetReturnOptions, to then be + * transferred to targetInterp. */ + Tcl_Interp *targetInterp) /* Interp where result and return options * should be stored. If source and target are * the same, nothing is done. */ { @@ -1198,7 +1192,7 @@ Tcl_TransferResult( return; } - if (result == TCL_OK && siPtr->returnOpts == NULL) { + if (code == TCL_OK && siPtr->returnOpts == NULL) { /* * Special optimization for the common case of normal command return * code and no explicit return options. @@ -1210,7 +1204,7 @@ Tcl_TransferResult( } } else { Tcl_SetReturnOptions(targetInterp, - Tcl_GetReturnOptions(sourceInterp, result)); + Tcl_GetReturnOptions(sourceInterp, code)); tiPtr->flags &= ~(ERR_ALREADY_LOGGED); } Tcl_SetObjResult(targetInterp, Tcl_GetObjResult(sourceInterp)); diff --git a/generic/tclScan.c b/generic/tclScan.c index 6f9515b..f499711 100644 --- a/generic/tclScan.c +++ b/generic/tclScan.c @@ -10,7 +10,7 @@ */ #include "tclInt.h" -#include "tommath.h" +#include "tclTomMath.h" /* * Flag values used by Tcl_ScanObjCmd. @@ -261,11 +261,11 @@ ValidateFormat( Tcl_UniChar ch = 0; int objIndex, xpgSize, nspace = numVars; int *nassign = TclStackAlloc(interp, nspace * sizeof(int)); - char buf[TCL_UTF_MAX + 1] = ""; Tcl_Obj *errorMsg; /* Place to build an error messages. Note that * these are messy operations because we do * not want to use the formatting engine; * we're inside there! */ + char buf[TCL_UTF_MAX + 1] = ""; /* * Initialize an array that records the number of times a variable is @@ -929,13 +929,12 @@ Tcl_ScanObjCmd( } if ((flags & SCAN_UNSIGNED) && (wideValue < 0)) { mp_int big; - if (mp_init(&big) != MP_OKAY) { + if (mp_init_u64(&big, (Tcl_WideUInt)wideValue) != MP_OKAY) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "insufficient memory to create bignum", -1)); Tcl_SetErrorCode(interp, "TCL", "MEMORY", NULL); return TCL_ERROR; } else { - mp_set_ull(&big, (Tcl_WideUInt)wideValue); Tcl_SetBignumObj(objPtr, &big); } } else { @@ -976,13 +975,12 @@ Tcl_ScanObjCmd( if ((flags & SCAN_UNSIGNED) && (value < 0)) { #ifdef TCL_WIDE_INT_IS_LONG mp_int big; - if (mp_init(&big) != MP_OKAY) { + if (mp_init_u64(&big, (unsigned long)value) != MP_OKAY) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "insufficient memory to create bignum", -1)); Tcl_SetErrorCode(interp, "TCL", "MEMORY", NULL); return TCL_ERROR; } else { - mp_set_ull(&big, (unsigned long)value); Tcl_SetBignumObj(objPtr, &big); } #else diff --git a/generic/tclStrToD.c b/generic/tclStrToD.c index d624f87..e0c9f15 100644 --- a/generic/tclStrToD.c +++ b/generic/tclStrToD.c @@ -14,9 +14,14 @@ */ #include "tclInt.h" -#include "tommath.h" +#include "tclTomMath.h" +#include <float.h> #include <math.h> +#ifdef _WIN32 +#define copysign _copysign +#endif + /* * This code supports (at least hypothetically), IBM, Cray, VAX and IEEE-754 * floating point; of these, only IEEE-754 can represent NaN. IEEE-754 can be @@ -289,10 +294,10 @@ static const Tcl_WideUInt wuipow5[27] = { static int AccumulateDecimalDigit(unsigned, int, Tcl_WideUInt *, mp_int *, int); static double MakeHighPrecisionDouble(int signum, - mp_int *significand, int nSigDigs, int exponent); + mp_int *significand, int nSigDigs, long exponent); static double MakeLowPrecisionDouble(int signum, Tcl_WideUInt significand, int nSigDigs, - int exponent); + long exponent); #ifdef IEEE_FLOATING_POINT static double MakeNaN(int signum, Tcl_WideUInt tag); #endif @@ -706,7 +711,7 @@ TclParseNumber( || (octalSignificandWide > ((Tcl_WideUInt)-1 >> shift)))) { octalSignificandOverflow = 1; - mp_init_ull(&octalSignificandBig, + mp_init_u64(&octalSignificandBig, octalSignificandWide); } } @@ -771,7 +776,7 @@ TclParseNumber( ((size_t)shift >= CHAR_BIT*sizeof(Tcl_WideUInt) || significandWide > ((Tcl_WideUInt)-1 >> shift))) { significandOverflow = 1; - mp_init_ull(&significandBig, + mp_init_u64(&significandBig, significandWide); } } @@ -790,6 +795,7 @@ TclParseNumber( acceptState = state; acceptPoint = p; acceptLen = len; + /* FALLTHRU */ case ZERO_B: zerob: if (c == '0') { @@ -812,7 +818,7 @@ TclParseNumber( ((size_t)shift >= CHAR_BIT*sizeof(Tcl_WideUInt) || significandWide > ((Tcl_WideUInt)-1 >> shift))) { significandOverflow = 1; - mp_init_ull(&significandBig, + mp_init_u64(&significandBig, significandWide); } } @@ -1154,7 +1160,7 @@ TclParseNumber( ((size_t)shift >= CHAR_BIT*sizeof(Tcl_WideUInt) || significandWide > (MOST_BITS + signum) >> shift)) { significandOverflow = 1; - mp_init_ull(&significandBig, significandWide); + mp_init_u64(&significandBig, significandWide); } if (shift) { if (!significandOverflow) { @@ -1175,7 +1181,7 @@ TclParseNumber( ((size_t)shift >= CHAR_BIT*sizeof(Tcl_WideUInt) || significandWide > (MOST_BITS + signum) >> shift)) { significandOverflow = 1; - mp_init_ull(&significandBig, significandWide); + mp_init_u64(&significandBig, significandWide); } if (shift) { if (!significandOverflow) { @@ -1196,7 +1202,7 @@ TclParseNumber( ((size_t)shift >= CHAR_BIT*sizeof(Tcl_WideUInt) || octalSignificandWide > (MOST_BITS + signum) >> shift)) { octalSignificandOverflow = 1; - mp_init_ull(&octalSignificandBig, + mp_init_u64(&octalSignificandBig, octalSignificandWide); } if (shift) { @@ -1209,7 +1215,7 @@ TclParseNumber( } if (!octalSignificandOverflow) { if (octalSignificandWide > (MOST_BITS + signum)) { - mp_init_ull(&octalSignificandBig, + mp_init_u64(&octalSignificandBig, octalSignificandWide); octalSignificandOverflow = 1; } else { @@ -1225,7 +1231,7 @@ TclParseNumber( } if (octalSignificandOverflow) { if (signum) { - mp_neg(&octalSignificandBig, &octalSignificandBig); + (void)mp_neg(&octalSignificandBig, &octalSignificandBig); } TclSetBignumIntRep(objPtr, &octalSignificandBig); } @@ -1235,14 +1241,14 @@ TclParseNumber( case DECIMAL: significandOverflow = AccumulateDecimalDigit(0, numTrailZeros-1, &significandWide, &significandBig, significandOverflow); - if (!significandOverflow && (significandWide > MOST_BITS+signum)){ + if (!significandOverflow && (significandWide > MOST_BITS+signum)) { significandOverflow = 1; - mp_init_ull(&significandBig, significandWide); + mp_init_u64(&significandBig, significandWide); } returnInteger: if (!significandOverflow) { if (significandWide > MOST_BITS+signum) { - mp_init_ull(&significandBig, + mp_init_u64(&significandBig, significandWide); significandOverflow = 1; } else { @@ -1258,7 +1264,7 @@ TclParseNumber( } if (significandOverflow) { if (signum) { - mp_neg(&significandBig, &significandBig); + (void)mp_neg(&significandBig, &significandBig); } TclSetBignumIntRep(objPtr, &significandBig); } @@ -1277,16 +1283,45 @@ TclParseNumber( objPtr->typePtr = &tclDoubleType; if (exponentSignum) { + /* + * At this point exponent>=0, so the following calculation + * cannot underflow. + */ exponent = -exponent; } + + /* + * Adjust the exponent for the number of trailing zeros that + * have not been accumulated, and the number of digits after + * the decimal point. Pin any overflow to LONG_MAX/LONG_MIN + * respectively. + */ + + if (exponent >= 0) { + if (exponent - numDigitsAfterDp > LONG_MAX - numTrailZeros) { + exponent = LONG_MAX; + } else { + exponent = exponent - numDigitsAfterDp + numTrailZeros; + } + } else { + if (exponent + numTrailZeros < LONG_MIN + numDigitsAfterDp) { + exponent = LONG_MIN; + } else { + exponent = exponent + numTrailZeros - numDigitsAfterDp; + } + } + + /* + * The desired number is now significandWide * 10**exponent + * or significandBig * 10**exponent, depending on whether + * the significand has overflowed a wide int. + */ if (!significandOverflow) { objPtr->internalRep.doubleValue = MakeLowPrecisionDouble( - signum, significandWide, numSigDigs, - numTrailZeros + exponent - numDigitsAfterDp); + signum, significandWide, numSigDigs, exponent); } else { objPtr->internalRep.doubleValue = MakeHighPrecisionDouble( - signum, &significandBig, numSigDigs, - numTrailZeros + exponent - numDigitsAfterDp); + signum, &significandBig, numSigDigs, exponent); } break; @@ -1303,7 +1338,7 @@ TclParseNumber( #ifdef IEEE_FLOATING_POINT case sNAN: case sNANFINISH: - objPtr->internalRep.doubleValue = MakeNaN(signum,significandWide); + objPtr->internalRep.doubleValue = MakeNaN(signum, significandWide); objPtr->typePtr = &tclDoubleType; break; #endif @@ -1394,7 +1429,7 @@ AccumulateDecimalDigit( * bignum and fall through into the bignum case. */ - mp_init_ull(bignumRepPtr, w); + mp_init_u64(bignumRepPtr, w); } else { /* * Wide multiplication. @@ -1467,9 +1502,9 @@ AccumulateDecimalDigit( static double MakeLowPrecisionDouble( int signum, /* 1 if the number is negative, 0 otherwise */ - Tcl_WideUInt significand, /* Significand of the number. */ - int numSigDigs, /* Number of digits in the significand. */ - int exponent) /* Power of ten. */ + Tcl_WideUInt significand, /* Significand of the number */ + int numSigDigs, /* Number of digits in the significand */ + long exponent) /* Power of ten */ { double retval; /* Value of the number. */ mp_int significandBig; /* Significand expressed as a bignum. */ @@ -1488,6 +1523,9 @@ MakeLowPrecisionDouble( * Test for the easy cases. */ + if (significand == 0) { + return copysign(0.0, -signum); + } if (numSigDigs <= QUICK_MAX) { if (exponent >= 0) { if (exponent <= mmaxpow) { @@ -1537,7 +1575,7 @@ MakeLowPrecisionDouble( * call MakeHighPrecisionDouble to do it the hard way. */ - mp_init_ull(&significandBig, significand); + mp_init_u64(&significandBig, significand); retval = MakeHighPrecisionDouble(0, &significandBig, numSigDigs, exponent); mp_clear(&significandBig); @@ -1580,10 +1618,10 @@ MakeLowPrecisionDouble( static double MakeHighPrecisionDouble( - int signum, /* 1=negative, 0=nonnegative. */ - mp_int *significand, /* Exact significand of the number. */ - int numSigDigs, /* Number of significant digits. */ - int exponent) /* Power of 10 by which to multiply. */ + int signum, /* 1=negative, 0=nonnegative */ + mp_int *significand, /* Exact significand of the number */ + int numSigDigs, /* Number of significant digits */ + long exponent) /* Power of 10 by which to multiply */ { double retval; int machexp; /* Machine exponent of a power of 10. */ @@ -1599,15 +1637,18 @@ MakeHighPrecisionDouble( TCL_IEEE_DOUBLE_ROUNDING; /* - * Quick checks for over/underflow. + * Quick checks for zero, and over/underflow. Be careful to avoid + * integer overflow when calculating with 'exponent'. */ - if (numSigDigs+exponent-1 > maxDigits) { + if (mp_iszero(significand)) { + return copysign(0.0, -signum); + } + if (exponent >= 0 && exponent-1 > maxDigits-numSigDigs) { retval = HUGE_VAL; goto returnValue; - } - if (numSigDigs+exponent-1 < minDigits) { - retval = 0; + } else if (exponent < 0 && numSigDigs+exponent < minDigits+1) { + retval = 0.0; goto returnValue; } @@ -1742,6 +1783,9 @@ RefineApproximation( * "round to even" functionality */ double rteSignificand; /* Significand of the round-to-even result */ int rteExponent; /* Exponent of the round-to-even result */ + int shift; /* Shift count for converting numerator + * and denominator of corrector to floating + * point */ Tcl_WideInt rteSigWide; /* Wide integer version of the significand * for testing evenness */ int i; @@ -1754,13 +1798,22 @@ RefineApproximation( if (approxResult == HUGE_VAL) { return approxResult; } + significand = frexp(approxResult, &binExponent); /* - * Find a common denominator for the decimal and binary fractions. The - * common denominator will be 2**M2 + 5**M5. + * We are trying to compute a corrector term that, when added to the + * approximate result, will yield close to the exact result. + * The exact result is exactSignificand * 10**exponent. + * The approximate result is significand * 2**binExponent + * If exponent<0, we need to multiply the exact value by 10**-exponent + * to make it an integer, plus another factor of 2 to decide on rounding. + * Similarly if binExponent<FP_PRECISION, we need + * to multiply by 2**FP_PRECISION to make the approximate value an integer. + * + * Let M = 2**M2 * 5**M5 be the least common multiple of these two + * multipliers. */ - significand = frexp(approxResult, &binExponent); i = mantBits - binExponent; if (i < 0) { M2 = 0; @@ -1777,12 +1830,9 @@ RefineApproximation( } /* - * The floating point number is significand*2**binExponent. Compute the - * large integer significand*2**(binExponent+M2+1). 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. + * Compute twoMv as 2*M*v, where v is the approximate value. + * This is done by bit-whacking to calculate 2**(M2+1)*significand, + * and then multiplying by 5**M5. */ msb = binExponent + M2; /* 1008 */ @@ -1803,10 +1853,9 @@ RefineApproximation( } /* - * 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). + * Compute twoMd as 2*M*d, where d is the exact value. + * This is done by multiplying by 5**(M5+exponent) and then multiplying + * by 2**(M5+exponent+1), which is, of couse, a left shift. */ mp_init_copy(&twoMd, exactSignificand); @@ -1816,17 +1865,23 @@ RefineApproximation( } } mp_mul_2d(&twoMd, M2+exponent+1, &twoMd); + + /* + * Now let twoMd = twoMd - twoMv, the difference between the exact and + * approximate values. + */ + 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. + * denominator by a factor of 2**binExponent-mantBits. Place that factor + * times 1/2 ULP into twoMd. */ scale = binExponent - mantBits - 1; - - mp_set(&twoMv, 1); + mp_set_u64(&twoMv, 1); for (i=0; i<=8; ++i) { if (M5 & (1 << i)) { mp_mul(&twoMv, pow5+i, &twoMv); @@ -1839,25 +1894,36 @@ RefineApproximation( mp_div_2d(&twoMv, -multiplier, &twoMv, NULL); } + /* + * Will the eventual correction term be less than, equal to, or + * greater than 1/2 ULP? + */ + switch (mp_cmp_mag(&twoMd, &twoMv)) { case MP_LT: /* - * 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 the error is less than 1/2 ULP, there's no correction to make. */ mp_clear(&twoMd); mp_clear(&twoMv); return approxResult; case MP_EQ: /* - * If the result is exactly unity, we need to round to even. + * If the error is exactly 1/2 ULP, we need to round to even. */ roundToEven = 1; break; case MP_GT: + /* + * We need to correct the result if the error exceeds 1/2 ULP. + */ break; } + /* + * If we're in the 'round to even' case, and the significand is already + * even, we're done. Return the approximate result. + */ if (roundToEven) { rteSignificand = frexp(approxResult, &rteExponent); rteSigWide = (Tcl_WideInt) ldexp(rteSignificand, FP_PRECISION); @@ -1869,6 +1935,16 @@ RefineApproximation( } /* + * Reduce the numerator and denominator of the corrector term so that + * they will fit in the floating point precision. + */ + shift = mp_count_bits(&twoMv) - FP_PRECISION - 1; + if (shift > 0) { + mp_div_2d(&twoMv, shift, &twoMv, NULL); + mp_div_2d(&twoMd, shift, &twoMd, NULL); + } + + /* * Convert the numerator and denominator of the corrector term accurately * to floating point numbers. */ @@ -3204,7 +3280,7 @@ ShorteningBignumConversionPowD( * mminus = 5**m5 */ - mp_init_ull(&b, bw); + mp_init_u64(&b, bw); mp_init_set(&mminus, 1); MulPow5(&b, b5, &b); mp_mul_2d(&b, b2, &b); @@ -3388,7 +3464,7 @@ StrictBignumConversionPowD( * b = bw * 2**b2 * 5**b5 */ - mp_init_ull(&b, bw); + mp_init_u64(&b, bw); MulPow5(&b, b5, &b); mp_mul_2d(&b, b2, &b); @@ -3588,7 +3664,7 @@ ShorteningBignumConversion( * S = 2**s2 * 5*s5 */ - mp_init_ull(&b, bw); + mp_init_u64(&b, bw); mp_mul_2d(&b, b2, &b); mp_init_set(&S, 1); MulPow5(&S, s5, &S); mp_mul_2d(&S, s2, &S); @@ -3797,7 +3873,7 @@ StrictBignumConversion( */ mp_init_multi(&dig, NULL); - mp_init_ull(&b, bw); + mp_init_u64(&b, bw); mp_mul_2d(&b, b2, &b); mp_init_set(&S, 1); MulPow5(&S, s5, &S); mp_mul_2d(&S, s2, &S); @@ -4274,7 +4350,8 @@ TclInitDoubleConversion(void) maxpow10_wide = (int) floor(sizeof(Tcl_WideUInt) * CHAR_BIT * log(2.) / log(10.)); - pow10_wide = Tcl_Alloc((maxpow10_wide + 1) * sizeof(Tcl_WideUInt)); + pow10_wide = (Tcl_WideUInt *) + Tcl_Alloc((maxpow10_wide + 1) * sizeof(Tcl_WideUInt)); u = 1; for (i = 0; i < maxpow10_wide; ++i) { pow10_wide[i] = u; @@ -4317,11 +4394,11 @@ TclInitDoubleConversion(void) for (i=0; i<9; ++i) { mp_init(pow5 + i); } - mp_set(pow5, 5); + mp_set_u64(pow5, 5); for (i=0; i<8; ++i) { mp_sqr(pow5+i, pow5+i+1); } - mp_init_ul(pow5_13, 1220703125); + mp_init_u64(pow5_13, 1220703125); for (i = 1; i < 5; ++i) { mp_init(pow5_13 + i); mp_sqr(pow5_13 + i - 1, pow5_13 + i); @@ -4439,7 +4516,7 @@ Tcl_InitBignumFromDouble( Tcl_WideInt w = (Tcl_WideInt) ldexp(fract, mantBits); int shift = expt - mantBits; - mp_init_ll(b, w); + mp_init_i64(b, w); if (shift < 0) { mp_div_2d(b, -shift, b, NULL); } else if (shift > 0) { @@ -4602,7 +4679,7 @@ TclCeil( mp_int d; mp_init(&d); mp_div_2d(a, -shift, &b, &d); - exact = d.used == 0; + exact = mp_iszero(&d); mp_clear(&d); } else { mp_copy(a, &b); diff --git a/generic/tclStringObj.c b/generic/tclStringObj.c index de05ed4..7ab0bd9 100644 --- a/generic/tclStringObj.c +++ b/generic/tclStringObj.c @@ -35,7 +35,7 @@ */ #include "tclInt.h" -#include "tommath.h" +#include "tclTomMath.h" #include "tclStringRep.h" #include "assert.h" @@ -2166,7 +2166,7 @@ Tcl_AppendFormatToObj( uw /= base; } #endif - } else if (useBig && big.used) { + } else if (useBig && !mp_iszero(&big)) { int leftover = (big.used * MP_DIGIT_BIT) % numBits; mp_digit mask = (~(mp_digit)0) << (MP_DIGIT_BIT-leftover); @@ -2205,7 +2205,7 @@ Tcl_AppendFormatToObj( while (numDigits--) { int digitOffset; - if (useBig && big.used) { + if (useBig && !mp_iszero(&big)) { if (index < big.used && (size_t) shift < CHAR_BIT*sizeof(Tcl_WideUInt) - MP_DIGIT_BIT) { bits |= ((Tcl_WideUInt) big.dp[index++]) << shift; diff --git a/generic/tclStubInit.c b/generic/tclStubInit.c index 6c11147..01434b9 100644 --- a/generic/tclStubInit.c +++ b/generic/tclStubInit.c @@ -11,6 +11,7 @@ #include "tclInt.h" #include "tommath_private.h" +#include "tclTomMath.h" #ifdef __CYGWIN__ # include <wchar.h> @@ -29,8 +30,10 @@ #undef Tcl_Alloc #undef Tcl_Free #undef Tcl_Realloc +#undef Tcl_NewBooleanObj #undef Tcl_NewByteArrayObj #undef Tcl_NewDoubleObj +#undef Tcl_NewIntObj #undef Tcl_NewListObj #undef Tcl_NewLongObj #undef Tcl_DbNewLongObj @@ -39,82 +42,99 @@ #undef Tcl_GetUnicode #undef Tcl_DumpActiveMemory #undef Tcl_ValidateAllMemory +#undef Tcl_FindHashEntry +#undef Tcl_CreateHashEntry +#undef Tcl_Panic +#undef Tcl_FindExecutable #undef Tcl_SetExitProc #undef Tcl_SetPanicProc #undef TclpGetPid +#undef TclSockMinimumBuffers +#undef Tcl_SetIntObj +#undef Tcl_SetLongObj +#undef TclpInetNtoa +#undef TclWinGetServByName +#undef TclWinGetSockOpt +#undef TclWinSetSockOpt +#undef TclWinNToHS #undef TclStaticPackage #undef Tcl_BackgroundError -#undef Tcl_UtfToUniChar -#undef Tcl_UtfToUniCharDString -#undef Tcl_UniCharToUtfDString #define TclStaticPackage Tcl_StaticPackage +#undef Tcl_UniCharToUtfDString +#undef Tcl_UtfToUniCharDString +#undef Tcl_UtfToUniChar -#ifdef TCL_MEM_DEBUG -# define Tcl_Alloc TclpAlloc -# define Tcl_Free TclpFree -# define Tcl_Realloc TclpRealloc -# undef Tcl_AttemptAlloc -# define Tcl_AttemptAlloc TclpAlloc -# undef Tcl_AttemptRealloc -# define Tcl_AttemptRealloc TclpRealloc -#endif - -MP_SET_UNSIGNED(mp_set_ull, Tcl_WideUInt) -MP_SET_SIGNED(mp_set_ll, mp_set_ull, Tcl_WideInt, Tcl_WideUInt) -MP_GET_MAG(mp_get_mag_ull, Tcl_WideUInt) - -mp_err TclBN_mp_set_int(mp_int *a, unsigned long i) -{ - mp_set_ul(a, i); - return MP_OKAY; -} - -static mp_err TclBN_mp_set_long(mp_int *a, unsigned long i) -{ - mp_set_ul(a, i); - return MP_OKAY; -} - -#define TclBN_mp_set_ul (void (*)(mp_int *a, unsigned long i))TclBN_mp_set_long - -mp_err MP_WUR TclBN_mp_expt_u32(const mp_int *a, unsigned int b, mp_int *c) { - return TclBN_s_mp_expt_u32(a, b, c); -} - -mp_err TclBN_mp_add_d(const mp_int *a, unsigned int b, mp_int *c) { - return TclBN_s_mp_add_d(a, b, c); -} -mp_err TclBN_mp_cmp_d(const mp_int *a, unsigned int b) { - return TclBN_s_mp_cmp_d(a, b); -} -mp_err TclBN_mp_sub_d(const mp_int *a, unsigned int b, mp_int *c) { - return TclBN_s_mp_sub_d(a, b, c); -} - -mp_err TclBN_mp_div_d(const mp_int *a, unsigned int b, mp_int *c, unsigned int *d) { - mp_digit d2; - mp_err result = TclBN_s_mp_div_d(a, b, c, (d ? &d2 : NULL)); - if (d) { - *d = d2; - } - return result; -} -mp_err TclBN_mp_init_set(mp_int *a, unsigned int b) { - return TclBN_s_mp_init_set(a, b); -} -mp_err TclBN_mp_mul_d(const mp_int *a, unsigned int b, mp_int *c) { - return TclBN_s_mp_mul_d(a, b, c); -} -void TclBN_mp_set(mp_int *a, unsigned int b) { - TclBN_s_mp_set(a, b); -} - - +#define TclBN_mp_add mp_add +#define TclBN_mp_add_d mp_add_d +#define TclBN_mp_and mp_and +#define TclBN_mp_clamp mp_clamp +#define TclBN_mp_clear mp_clear +#define TclBN_mp_clear_multi mp_clear_multi +#define TclBN_mp_cmp mp_cmp +#define TclBN_mp_cmp_d mp_cmp_d +#define TclBN_mp_cmp_mag mp_cmp_mag +#define TclBN_mp_cnt_lsb mp_cnt_lsb +#define TclBN_mp_copy mp_copy +#define TclBN_mp_count_bits mp_count_bits +#define TclBN_mp_div mp_div +#define TclBN_mp_div_d mp_div_d +#define TclBN_mp_div_2 mp_div_2 +#define TclBN_mp_div_2d mp_div_2d +#define TclBN_mp_exch mp_exch +#define TclBN_mp_expt_u32 mp_expt_u32 +#define TclBN_mp_get_mag_u64 mp_get_mag_u64 +#define TclBN_mp_grow mp_grow +#define TclBN_mp_init mp_init +#define TclBN_mp_init_copy mp_init_copy +#define TclBN_mp_init_multi mp_init_multi +#define TclBN_mp_init_set mp_init_set +#define TclBN_mp_init_size mp_init_size +#define TclBN_mp_init_i64 mp_init_i64 +#define TclBN_mp_init_u64 mp_init_u64 +#define TclBN_mp_lshd mp_lshd +#define TclBN_mp_mod mp_mod +#define TclBN_mp_mod_2d mp_mod_2d +#define TclBN_mp_mul mp_mul +#define TclBN_mp_mul_d mp_mul_d +#define TclBN_mp_mul_2 mp_mul_2 +#define TclBN_mp_mul_2d mp_mul_2d +#define TclBN_mp_neg mp_neg +#define TclBN_mp_or mp_or +#define TclBN_mp_radix_size mp_radix_size +#define TclBN_mp_reverse mp_reverse +#define TclBN_mp_read_radix mp_read_radix +#define TclBN_mp_rshd mp_rshd +#define TclBN_mp_set_i64 mp_set_i64 +#define TclBN_mp_set_u64 mp_set_u64 +#define TclBN_mp_shrink mp_shrink +#define TclBN_mp_sqr mp_sqr +#define TclBN_mp_sqrt mp_sqrt +#define TclBN_mp_sub mp_sub +#define TclBN_mp_sub_d mp_sub_d +#define TclBN_mp_signed_rsh mp_signed_rsh +#define TclBN_mp_to_radix mp_to_radix +#define TclBN_mp_to_ubin mp_to_ubin +#define TclBN_mp_ubin_size mp_ubin_size +#define TclBN_mp_xor mp_xor +#define TclBN_mp_zero mp_zero +#define TclBN_s_mp_add s_mp_add +#define TclBN_s_mp_balance_mul mp_balance_mul +#define TclBN_mp_karatsuba_mul s_mp_karatsuba_mul +#define TclBN_mp_karatsuba_sqr s_mp_karatsuba_sqr +#define TclBN_s_mp_mul_digs s_mp_mul_digs +#define TclBN_s_mp_mul_digs_fast s_mp_mul_digs_fast +#define TclBN_s_mp_reverse s_mp_reverse +#define TclBN_s_mp_sqr s_mp_sqr +#define TclBN_s_mp_sqr_fast s_mp_sqr_fast +#define TclBN_s_mp_sub s_mp_sub +#define TclBN_mp_toom_mul s_mp_toom_mul +#define TclBN_mp_toom_sqr s_mp_toom_sqr #ifdef _WIN32 # define TclUnixWaitForFile 0 # define TclUnixCopyFile 0 # define TclUnixOpenTemporaryFile 0 +# define TclpReaddir 0 # define TclpIsAtty 0 #elif defined(__CYGWIN__) # define TclpIsAtty TclPlatIsAtty @@ -125,6 +145,7 @@ doNothing(void) } # define TclWinAddProcess (void (*) (void *, size_t)) doNothing # define TclWinFlushDirtyChannels doNothing + static int TclpIsAtty(int fd) { @@ -135,7 +156,7 @@ void *TclWinGetTclInstance() { void *hInstance = NULL; GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, - (const char *)&TclpIsAtty, &hInstance); + (const wchar_t *)&TclpIsAtty, &hInstance); return hInstance; } @@ -197,6 +218,23 @@ static int exprIntObj(Tcl_Interp *interp, Tcl_Obj*expr, int *ptr){ return result; } #define Tcl_ExprLongObj (int(*)(Tcl_Interp*,Tcl_Obj*,long*))exprIntObj +static int uniCharNcmp(const Tcl_UniChar *ucs, const Tcl_UniChar *uct, unsigned int n){ + return Tcl_UniCharNcmp(ucs, uct, (unsigned long)n); +} +#define Tcl_UniCharNcmp (int(*)(const Tcl_UniChar*,const Tcl_UniChar*,unsigned long))(void *)uniCharNcmp +static int utfNcmp(const char *s1, const char *s2, unsigned int n){ + return Tcl_UtfNcmp(s1, s2, (unsigned long)n); +} +#define Tcl_UtfNcmp (int(*)(const char*,const char*,unsigned long))(void *)utfNcmp +static int utfNcasecmp(const char *s1, const char *s2, unsigned int n){ + return Tcl_UtfNcasecmp(s1, s2, (unsigned long)n); +} +#define Tcl_UtfNcasecmp (int(*)(const char*,const char*,unsigned long))(void *)utfNcasecmp +static int uniCharNcasecmp(const Tcl_UniChar *ucs, const Tcl_UniChar *uct, unsigned int n){ + return Tcl_UniCharNcasecmp(ucs, uct, (unsigned long)n); +} +#define Tcl_UniCharNcasecmp (int(*)(const Tcl_UniChar*,const Tcl_UniChar*,unsigned long))(void *)uniCharNcasecmp + #endif /* TCL_WIDE_INT_IS_LONG */ #endif /* __CYGWIN__ */ @@ -274,7 +312,7 @@ static const TclIntStubs tclIntStubs = { 0, /* 47 */ 0, /* 48 */ 0, /* 49 */ - TclInitCompiledLocals, /* 50 */ + 0, /* 50 */ TclInterpInit, /* 51 */ 0, /* 52 */ TclInvokeObjectCommand, /* 53 */ @@ -640,7 +678,7 @@ const TclTomMathStubs tclTomMathStubs = { TclBN_mp_read_radix, /* 36 */ TclBN_mp_rshd, /* 37 */ TclBN_mp_shrink, /* 38 */ - TclBN_mp_set, /* 39 */ + 0, /* 39 */ 0, /* 40 */ TclBN_mp_sqrt, /* 41 */ TclBN_mp_sub, /* 42 */ @@ -662,18 +700,18 @@ const TclTomMathStubs tclTomMathStubs = { 0, /* 58 */ 0, /* 59 */ 0, /* 60 */ - TclBN_mp_init_ul, /* 61 */ - TclBN_mp_set_ul, /* 62 */ + 0, /* 61 */ + 0, /* 62 */ TclBN_mp_cnt_lsb, /* 63 */ - TclBNInitBignumFromLong, /* 64 */ - TclBNInitBignumFromWideInt, /* 65 */ - TclBNInitBignumFromWideUInt, /* 66 */ + 0, /* 64 */ + TclBN_mp_init_i64, /* 65 */ + TclBN_mp_init_u64, /* 66 */ 0, /* 67 */ - TclBN_mp_set_ull, /* 68 */ - TclBN_mp_get_mag_ull, /* 69 */ - TclBN_mp_set_ll, /* 70 */ - TclBN_mp_get_mag_ul, /* 71 */ - TclBN_mp_set_l, /* 72 */ + TclBN_mp_set_u64, /* 68 */ + TclBN_mp_get_mag_u64, /* 69 */ + TclBN_mp_set_i64, /* 70 */ + 0, /* 71 */ + 0, /* 72 */ 0, /* 73 */ 0, /* 74 */ 0, /* 75 */ diff --git a/generic/tclTest.c b/generic/tclTest.c index f49a7cd..7cdcf0e 100644 --- a/generic/tclTest.c +++ b/generic/tclTest.c @@ -20,6 +20,7 @@ # define USE_TCL_STUBS #endif #include "tclInt.h" +#include "tclTomMath.h" #include "tclOO.h" #include <math.h> @@ -2922,7 +2923,7 @@ TestlinkCmd( return TCL_ERROR; } flag = (writable != 0) ? 0 : TCL_LINK_READ_ONLY; - if (Tcl_LinkVar(interp, "int", (char *) &intVar, + if (Tcl_LinkVar(interp, "int", &intVar, TCL_LINK_INT | flag) != TCL_OK) { return TCL_ERROR; } @@ -2930,7 +2931,7 @@ TestlinkCmd( return TCL_ERROR; } flag = (writable != 0) ? 0 : TCL_LINK_READ_ONLY; - if (Tcl_LinkVar(interp, "real", (char *) &realVar, + if (Tcl_LinkVar(interp, "real", &realVar, TCL_LINK_DOUBLE | flag) != TCL_OK) { return TCL_ERROR; } @@ -2938,7 +2939,7 @@ TestlinkCmd( return TCL_ERROR; } flag = (writable != 0) ? 0 : TCL_LINK_READ_ONLY; - if (Tcl_LinkVar(interp, "bool", (char *) &boolVar, + if (Tcl_LinkVar(interp, "bool", &boolVar, TCL_LINK_BOOLEAN | flag) != TCL_OK) { return TCL_ERROR; } @@ -2946,7 +2947,7 @@ TestlinkCmd( return TCL_ERROR; } flag = (writable != 0) ? 0 : TCL_LINK_READ_ONLY; - if (Tcl_LinkVar(interp, "string", (char *) &stringVar, + if (Tcl_LinkVar(interp, "string", &stringVar, TCL_LINK_STRING | flag) != TCL_OK) { return TCL_ERROR; } @@ -2954,7 +2955,7 @@ TestlinkCmd( return TCL_ERROR; } flag = (writable != 0) ? 0 : TCL_LINK_READ_ONLY; - if (Tcl_LinkVar(interp, "wide", (char *) &wideVar, + if (Tcl_LinkVar(interp, "wide", &wideVar, TCL_LINK_WIDE_INT | flag) != TCL_OK) { return TCL_ERROR; } @@ -2962,7 +2963,7 @@ TestlinkCmd( return TCL_ERROR; } flag = (writable != 0) ? 0 : TCL_LINK_READ_ONLY; - if (Tcl_LinkVar(interp, "char", (char *) &charVar, + if (Tcl_LinkVar(interp, "char", &charVar, TCL_LINK_CHAR | flag) != TCL_OK) { return TCL_ERROR; } @@ -2970,7 +2971,7 @@ TestlinkCmd( return TCL_ERROR; } flag = (writable != 0) ? 0 : TCL_LINK_READ_ONLY; - if (Tcl_LinkVar(interp, "uchar", (char *) &ucharVar, + if (Tcl_LinkVar(interp, "uchar", &ucharVar, TCL_LINK_UCHAR | flag) != TCL_OK) { return TCL_ERROR; } @@ -2978,7 +2979,7 @@ TestlinkCmd( return TCL_ERROR; } flag = (writable != 0) ? 0 : TCL_LINK_READ_ONLY; - if (Tcl_LinkVar(interp, "short", (char *) &shortVar, + if (Tcl_LinkVar(interp, "short", &shortVar, TCL_LINK_SHORT | flag) != TCL_OK) { return TCL_ERROR; } @@ -2986,7 +2987,7 @@ TestlinkCmd( return TCL_ERROR; } flag = (writable != 0) ? 0 : TCL_LINK_READ_ONLY; - if (Tcl_LinkVar(interp, "ushort", (char *) &ushortVar, + if (Tcl_LinkVar(interp, "ushort", &ushortVar, TCL_LINK_USHORT | flag) != TCL_OK) { return TCL_ERROR; } @@ -2994,7 +2995,7 @@ TestlinkCmd( return TCL_ERROR; } flag = (writable != 0) ? 0 : TCL_LINK_READ_ONLY; - if (Tcl_LinkVar(interp, "uint", (char *) &uintVar, + if (Tcl_LinkVar(interp, "uint", &uintVar, TCL_LINK_UINT | flag) != TCL_OK) { return TCL_ERROR; } @@ -3002,7 +3003,7 @@ TestlinkCmd( return TCL_ERROR; } flag = (writable != 0) ? 0 : TCL_LINK_READ_ONLY; - if (Tcl_LinkVar(interp, "long", (char *) &longVar, + if (Tcl_LinkVar(interp, "long", &longVar, TCL_LINK_LONG | flag) != TCL_OK) { return TCL_ERROR; } @@ -3010,7 +3011,7 @@ TestlinkCmd( return TCL_ERROR; } flag = (writable != 0) ? 0 : TCL_LINK_READ_ONLY; - if (Tcl_LinkVar(interp, "ulong", (char *) &ulongVar, + if (Tcl_LinkVar(interp, "ulong", &ulongVar, TCL_LINK_ULONG | flag) != TCL_OK) { return TCL_ERROR; } @@ -3018,7 +3019,7 @@ TestlinkCmd( return TCL_ERROR; } flag = (writable != 0) ? 0 : TCL_LINK_READ_ONLY; - if (Tcl_LinkVar(interp, "float", (char *) &floatVar, + if (Tcl_LinkVar(interp, "float", &floatVar, TCL_LINK_FLOAT | flag) != TCL_OK) { return TCL_ERROR; } @@ -3026,7 +3027,7 @@ TestlinkCmd( return TCL_ERROR; } flag = (writable != 0) ? 0 : TCL_LINK_READ_ONLY; - if (Tcl_LinkVar(interp, "uwide", (char *) &uwideVar, + if (Tcl_LinkVar(interp, "uwide", &uwideVar, TCL_LINK_WIDE_UINT | flag) != TCL_OK) { return TCL_ERROR; } diff --git a/generic/tclTestObj.c b/generic/tclTestObj.c index f7bfcc4..34965d1 100644 --- a/generic/tclTestObj.c +++ b/generic/tclTestObj.c @@ -18,7 +18,11 @@ # define USE_TCL_STUBS #endif #include "tclInt.h" -#include "tommath.h" +#ifdef TCL_WITH_EXTERNAL_TOMMATH +# include "tommath.h" +#else +# include "tclTomMath.h" +#endif #include "tclStringRep.h" diff --git a/generic/tclTimer.c b/generic/tclTimer.c index c195f08..5451614 100644 --- a/generic/tclTimer.c +++ b/generic/tclTimer.c @@ -892,7 +892,7 @@ Tcl_AfterObjCmd( if (objc == 3) { commandPtr = objv[2]; } else { - commandPtr = Tcl_ConcatObj(objc-2, objv+2);; + commandPtr = Tcl_ConcatObj(objc-2, objv+2); } command = TclGetStringFromObj(commandPtr, &length); for (afterPtr = assocPtr->firstAfterPtr; afterPtr != NULL; diff --git a/generic/tclTomMath.decls b/generic/tclTomMath.decls index 3dbe18c..a47f7ef 100644 --- a/generic/tclTomMath.decls +++ b/generic/tclTomMath.decls @@ -33,7 +33,7 @@ declare 2 { mp_err MP_WUR TclBN_mp_add(const mp_int *a, const mp_int *b, mp_int *c) } declare 3 { - mp_err MP_WUR TclBN_mp_add_d(const mp_int *a, unsigned int b, mp_int *c) + mp_err MP_WUR TclBN_mp_add_d(const mp_int *a, mp_digit b, mp_int *c) } declare 4 { mp_err MP_WUR TclBN_mp_and(const mp_int *a, const mp_int *b, mp_int *c) @@ -51,7 +51,7 @@ declare 8 { mp_ord MP_WUR TclBN_mp_cmp(const mp_int *a, const mp_int *b) } declare 9 { - mp_ord MP_WUR TclBN_mp_cmp_d(const mp_int *a, unsigned int b) + mp_ord MP_WUR TclBN_mp_cmp_d(const mp_int *a, mp_digit b) } declare 10 { mp_ord MP_WUR TclBN_mp_cmp_mag(const mp_int *a, const mp_int *b) @@ -66,7 +66,7 @@ declare 13 { mp_err MP_WUR TclBN_mp_div(const mp_int *a, const mp_int *b, mp_int *q, mp_int *r) } declare 14 { - mp_err MP_WUR TclBN_mp_div_d(const mp_int *a, unsigned int b, mp_int *q, unsigned int *r) + mp_err MP_WUR TclBN_mp_div_d(const mp_int *a, mp_digit b, mp_int *q, mp_digit *r) } declare 15 { mp_err MP_WUR TclBN_mp_div_2(const mp_int *a, mp_int *q) @@ -76,13 +76,13 @@ declare 16 { } # Removed in 9.0 #declare 17 {deprecated {is private function in libtommath}} { -# mp_err TclBN_mp_div_3(const mp_int *a, mp_int *q, unsigned int *r) +# mp_err TclBN_mp_div_3(const mp_int *a, mp_int *q, mp_digit *r) #} declare 18 { void TclBN_mp_exch(mp_int *a, mp_int *b) } declare 19 { - mp_err MP_WUR TclBN_mp_expt_u32(const mp_int *a, unsigned int b, mp_int *c) + mp_err MP_WUR TclBN_mp_expt_u32(const mp_int *a, uint32_t b, mp_int *c) } declare 20 { mp_err MP_WUR TclBN_mp_grow(mp_int *a, int size) @@ -97,7 +97,7 @@ declare 23 { mp_err MP_WUR TclBN_mp_init_multi(mp_int *a, ...) } declare 24 { - mp_err MP_WUR TclBN_mp_init_set(mp_int *a, unsigned int b) + mp_err MP_WUR TclBN_mp_init_set(mp_int *a, mp_digit b) } declare 25 { mp_err MP_WUR TclBN_mp_init_size(mp_int *a, int size) @@ -115,7 +115,7 @@ declare 29 { mp_err MP_WUR TclBN_mp_mul(const mp_int *a, const mp_int *b, mp_int *p) } declare 30 { - mp_err MP_WUR TclBN_mp_mul_d(const mp_int *a, unsigned int b, mp_int *p) + mp_err MP_WUR TclBN_mp_mul_d(const mp_int *a, mp_digit b, mp_int *p) } declare 31 { mp_err MP_WUR TclBN_mp_mul_2(const mp_int *a, mp_int *p) @@ -141,9 +141,10 @@ declare 37 { declare 38 { mp_err MP_WUR TclBN_mp_shrink(mp_int *a) } -declare 39 { - void TclBN_mp_set(mp_int *a, unsigned int b) -} +# Removed in 9.0 +#declare 39 {deprecated {macro calling mp_set_u64}} { +# void TclBN_mp_set(mp_int *a, unsigned int b) +#} # Removed in 9.0 #declare 40 {nostub {is private function in libtommath}} { # mp_err TclBN_mp_sqr(const mp_int *a, mp_int *b) @@ -155,7 +156,7 @@ declare 42 { mp_err MP_WUR TclBN_mp_sub(const mp_int *a, const mp_int *b, mp_int *c) } declare 43 { - mp_err MP_WUR TclBN_mp_sub_d(const mp_int *a, unsigned int b, mp_int *c) + mp_err MP_WUR TclBN_mp_sub_d(const mp_int *a, mp_digit b, mp_int *c) } # Removed in 9.0 #declare 44 { @@ -179,47 +180,41 @@ declare 48 { declare 49 { void TclBN_mp_zero(mp_int *a) } -declare 61 { - mp_err MP_WUR TclBN_mp_init_ul(mp_int *a, unsigned long i) -} -declare 62 { - void TclBN_mp_set_ul(mp_int *a, unsigned long i) -} +# Removed in 9.0 +#declare 61 {deprecated {macro calling mp_init_u64}} { +# mp_err TclBN_mp_init_ul(mp_int *a, unsigned long i) +#} +# Removed in 9.0 +#declare 62 {deprecated {macro calling mp_set_u64}} { +# void TclBN_mp_set_ul(mp_int *a, unsigned long i) +#} declare 63 { int MP_WUR TclBN_mp_cnt_lsb(const mp_int *a) } - -# Formerly internal API to allow initialisation of bignums without knowing the -# typedefs of how a bignum works internally. -declare 64 { - int TclBNInitBignumFromLong(mp_int *bignum, long initVal) -} +# Removed in 9.0 +#declare 64 {deprecated {macro calling mp_init_i64}} { +# int TclBN_mp_init_l(mp_int *bignum, long initVal) +#} declare 65 { - int TclBNInitBignumFromWideInt(mp_int *bignum, Tcl_WideInt initVal) + int MP_WUR TclBN_mp_init_i64(mp_int *bignum, int64_t initVal) } declare 66 { - int TclBNInitBignumFromWideUInt(mp_int *bignum, Tcl_WideUInt initVal) + int MP_WUR TclBN_mp_init_u64(mp_int *bignum, uint64_t initVal) } # Removed in 9.0 #declare 67 { -# mp_err TclBN_mp_expt_d_ex(const mp_int *a, unsigned int b, mp_int *c, int fast) +# mp_err TclBN_mp_expt_d_ex(const mp_int *a, mp_digit b, mp_int *c, int fast) #} # Added in libtommath 1.0.1 declare 68 { - void TclBN_mp_set_ull(mp_int *a, Tcl_WideUInt i) + void TclBN_mp_set_u64(mp_int *a, uint64_t i) } declare 69 { - Tcl_WideUInt MP_WUR TclBN_mp_get_mag_ull(const mp_int *a) + uint64_t MP_WUR TclBN_mp_get_mag_u64(const mp_int *a) } declare 70 { - void TclBN_mp_set_ll(mp_int *a, Tcl_WideInt i) -} -declare 71 { - unsigned long MP_WUR TclBN_mp_get_mag_ul(const mp_int *a) -} -declare 72 { - void TclBN_mp_set_l(mp_int *a, long i) + void TclBN_mp_set_i64(mp_int *a, int64_t i) } # Added in libtommath 1.1.0 @@ -243,6 +238,10 @@ declare 76 { declare 78 { int MP_WUR TclBN_mp_to_ubin(const mp_int *a, unsigned char *buf, size_t maxlen, size_t *written) } +# Removed in 9.0 +#declare 79 { +# mp_err MP_WUR TclBN_mp_div_ld(const mp_int *a, mp_digit b, mp_int *q, mp_digit *r) +#} declare 80 { int MP_WUR TclBN_mp_to_radix(const mp_int *a, char *str, size_t maxlen, size_t *written, int radix) } diff --git a/generic/tclTomMath.h b/generic/tclTomMath.h index 1ecd5be..e9257a0 100644 --- a/generic/tclTomMath.h +++ b/generic/tclTomMath.h @@ -1,1090 +1,14 @@ -/* LibTomMath, multiple-precision integer library -- Tom St Denis */ -/* SPDX-License-Identifier: Unlicense */ +#ifndef BN_TCL_H_ +#define BN_TCL_H_ -#ifndef BN_H_ -#define BN_H_ - -#ifndef MP_NO_STDINT +#ifdef MP_NO_STDINT +#ifdef HAVE_STDINT_H # include <stdint.h> -#endif -#include <stddef.h> -#include <limits.h> - -#ifndef MODULE_SCOPE -#define MODULE_SCOPE extern -#endif - -#ifdef LTM_NO_FILE -# warning LTM_NO_FILE has been deprecated, use MP_NO_FILE. -# define MP_NO_FILE -#endif - -#ifndef MP_NO_FILE -# include <stdio.h> -#endif - -#ifdef MP_8BIT -# ifdef _MSC_VER -# pragma message("8-bit (MP_8BIT) support is deprecated and will be dropped completely in the next version.") -# else -# warning "8-bit (MP_8BIT) support is deprecated and will be dropped completely in the next version." -# endif -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* MS Visual C++ doesn't have a 128bit type for words, so fall back to 32bit MPI's (where words are 64bit) */ -#if (defined(_WIN32) || defined(__LLP64__) || defined(__e2k__) || defined(__LCC__)) && !defined(MP_32BIT) && !defined(MP_64BIT) -# define MP_32BIT -#endif - -/* detect 64-bit mode if possible */ -#if defined(__x86_64__) || defined(_M_X64) || defined(_M_AMD64) || \ - defined(__powerpc64__) || defined(__ppc64__) || defined(__PPC64__) || \ - defined(__s390x__) || defined(__arch64__) || defined(__aarch64__) || \ - defined(__sparcv9) || defined(__sparc_v9__) || defined(__sparc64__) || \ - defined(__ia64) || defined(__ia64__) || defined(__itanium__) || defined(_M_IA64) || \ - defined(__LP64__) || defined(_LP64) || defined(__64BIT__) -# if !(defined(MP_64BIT) || defined(MP_32BIT) || defined(MP_16BIT) || defined(MP_8BIT)) -# if defined(__GNUC__) && !defined(__hppa) -/* we support 128bit integers only via: __attribute__((mode(TI))) */ -# define MP_64BIT -# else -/* otherwise we fall back to MP_32BIT even on 64bit platforms */ -# define MP_32BIT -# endif -# endif -#endif - -#ifdef MP_DIGIT_BIT -# error Defining MP_DIGIT_BIT is disallowed, use MP_8/16/31/32/64BIT -#endif - -/* some default configurations. - * - * A "mp_digit" must be able to hold MP_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 -typedef unsigned char mp_digit; -# define MP_DIGIT_BIT 7 -#elif defined(MP_16BIT) -typedef unsigned short mp_digit; -# define MP_DIGIT_BIT 15 -#elif defined(MP_64BIT) -/* for GCC only on supported platforms */ -typedef unsigned long long mp_digit; -# define MP_DIGIT_BIT 60 -#else -typedef unsigned int mp_digit; -# ifdef MP_31BIT -/* - * This is an extension that uses 31-bit digits. - * Please be aware that not all functions support this size, especially s_mp_mul_digs_fast - * will be reduced to work on small numbers only: - * Up to 8 limbs, 248 bits instead of up to 512 limbs, 15872 bits with MP_28BIT. - */ -# define MP_DIGIT_BIT 31 -# else -/* default case is 28-bit digits, defines MP_28BIT as a handy macro to test */ -# define MP_DIGIT_BIT 28 -# define MP_28BIT -# endif -#endif - -/* otherwise the bits per digit is calculated automatically from the size of a mp_digit */ -#ifndef MP_DIGIT_BIT -# define MP_DIGIT_BIT (((CHAR_BIT * MP_SIZEOF_MP_DIGIT) - 1)) /* bits per digit */ -#endif - -#define MP_MASK ((((mp_digit)1)<<((mp_digit)MP_DIGIT_BIT))-((mp_digit)1)) -#define MP_DIGIT_MAX MP_MASK - -/* Primality generation flags */ -#define MP_PRIME_BBS 0x0001 /* BBS style prime */ -#define MP_PRIME_SAFE 0x0002 /* Safe prime (p-1)/2 == prime */ -#define MP_PRIME_2MSB_ON 0x0008 /* force 2nd MSB to 1 */ - -#ifdef MP_USE_ENUMS -typedef enum { - MP_ZPOS = 0, /* positive */ - MP_NEG = 1 /* negative */ -} mp_sign; -typedef enum { - MP_LT = -1, /* less than */ - MP_EQ = 0, /* equal */ - MP_GT = 1 /* greater than */ -} mp_ord; -typedef enum { - MP_NO = 0, - MP_YES = 1 -} mp_bool; -typedef enum { - MP_OKAY = 0, /* no error */ - MP_ERR = -1, /* unknown error */ - MP_MEM = -2, /* out of mem */ - MP_VAL = -3, /* invalid input */ - MP_ITER = -4, /* maximum iterations reached */ - MP_BUF = -5 /* buffer overflow, supplied buffer too small */ -} mp_err; -typedef enum { - MP_LSB_FIRST = -1, - MP_MSB_FIRST = 1 -} mp_order; -typedef enum { - MP_LITTLE_ENDIAN = -1, - MP_NATIVE_ENDIAN = 0, - MP_BIG_ENDIAN = 1 -} mp_endian; -#else -typedef int mp_sign; -#define MP_ZPOS 0 /* positive integer */ -#define MP_NEG 1 /* negative */ -typedef int mp_ord; -#define MP_LT -1 /* less than */ -#define MP_EQ 0 /* equal to */ -#define MP_GT 1 /* greater than */ -typedef int mp_bool; -#define MP_YES 1 -#define MP_NO 0 -typedef int mp_err; -#define MP_OKAY 0 /* no error */ -#define MP_ERR -1 /* unknown error */ -#define MP_MEM -2 /* out of mem */ -#define MP_VAL -3 /* invalid input */ -#define MP_RANGE (MP_DEPRECATED_PRAGMA("MP_RANGE has been deprecated in favor of MP_VAL") MP_VAL) -#define MP_ITER -4 /* maximum iterations reached */ -#define MP_BUF -5 /* buffer overflow, supplied buffer too small */ -typedef int mp_order; -#define MP_LSB_FIRST -1 -#define MP_MSB_FIRST 1 -typedef int mp_endian; -#define MP_LITTLE_ENDIAN -1 -#define MP_NATIVE_ENDIAN 0 -#define MP_BIG_ENDIAN 1 -#endif - -/* tunable cutoffs */ - -#ifndef MP_FIXED_CUTOFFS -extern int -KARATSUBA_MUL_CUTOFF, -KARATSUBA_SQR_CUTOFF, -TOOM_MUL_CUTOFF, -TOOM_SQR_CUTOFF; -#endif - -/* 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 32 /* default digits of precision */ -# elif defined(MP_8BIT) -# define MP_PREC 16 /* default digits of precision */ -# else -# define MP_PREC 8 /* default digits of precision */ -# endif -#endif - -#if defined(__GNUC__) && __GNUC__ >= 4 -# define MP_NULL_TERMINATED __attribute__((sentinel)) -#else -# define MP_NULL_TERMINATED -#endif - -/* - * MP_WUR - warn unused result - * --------------------------- - * - * The result of functions annotated with MP_WUR must be - * checked and cannot be ignored. - * - * Most functions in libtommath return an error code. - * This error code must be checked in order to prevent crashes or invalid - * results. - * - * If you still want to avoid the error checks for quick and dirty programs - * without robustness guarantees, you can `#define MP_WUR` before including - * tommath.h, disabling the warnings. - */ -#ifndef MP_WUR -# if defined(__GNUC__) && __GNUC__ >= 4 -# define MP_WUR __attribute__((warn_unused_result)) -# else -# define MP_WUR -# endif -#endif - -#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 405) -# define MP_DEPRECATED(x) __attribute__((deprecated("replaced by " #x))) -# define PRIVATE_MP_DEPRECATED_PRAGMA(s) _Pragma(#s) -# define MP_DEPRECATED_PRAGMA(s) PRIVATE_MP_DEPRECATED_PRAGMA(GCC warning s) -#elif defined(_MSC_VER) && _MSC_VER >= 1500 -# define MP_DEPRECATED(x) __declspec(deprecated("replaced by " #x)) -# define MP_DEPRECATED_PRAGMA(s) __pragma(message(s)) -#else -# define MP_DEPRECATED(s) -# define MP_DEPRECATED_PRAGMA(s) -#endif - -#define DIGIT_BIT (MP_DEPRECATED_PRAGMA("DIGIT_BIT macro is deprecated, MP_DIGIT_BIT instead") MP_DIGIT_BIT) -#define USED(m) (MP_DEPRECATED_PRAGMA("USED macro is deprecated, use z->used instead") (m)->used) -#define DIGIT(m, k) (MP_DEPRECATED_PRAGMA("DIGIT macro is deprecated, use z->dp instead") (m)->dp[(k)]) -#define SIGN(m) (MP_DEPRECATED_PRAGMA("SIGN macro is deprecated, use z->sign instead") (m)->sign) - -/* 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; - mp_sign sign; - mp_digit *dp; -}; - -/* error code to char* string */ -/* -const char *mp_error_to_string(mp_err code) MP_WUR; -*/ - -/* ---> init and deinit bignum functions <--- */ -/* init a bignum */ -/* -mp_err mp_init(mp_int *a) MP_WUR; -*/ - -/* free a bignum */ -/* -void mp_clear(mp_int *a); -*/ - -/* init a null terminated series of arguments */ -/* -mp_err mp_init_multi(mp_int *mp, ...) MP_NULL_TERMINATED MP_WUR; -*/ - -/* clear a null terminated series of arguments */ -/* -void mp_clear_multi(mp_int *mp, ...) MP_NULL_TERMINATED; -*/ - -/* exchange two ints */ -/* -void mp_exch(mp_int *a, mp_int *b); -*/ - -/* shrink ram required for a bignum */ -/* -mp_err mp_shrink(mp_int *a) MP_WUR; -*/ - -/* grow an int to a given size */ -/* -mp_err mp_grow(mp_int *a, int size) MP_WUR; -*/ - -/* init to a given number of digits */ -/* -mp_err mp_init_size(mp_int *a, int size) MP_WUR; -*/ - -/* ---> Basic Manipulations <--- */ -#define mp_iszero(a) (((a)->used == 0) ? MP_YES : MP_NO) -#define mp_isodd(a) (((a)->used != 0 && (((a)->dp[0] & 1) == 1)) ? MP_YES : MP_NO) -#define mp_iseven(a) (((a)->used == 0 || (((a)->dp[0] & 1) == 0)) ? MP_YES : MP_NO) -#define mp_isneg(a) (((a)->sign != MP_ZPOS) ? MP_YES : MP_NO) - -/* set to zero */ -/* -void mp_zero(mp_int *a); -*/ - -/* get and set doubles */ -/* -double mp_get_double(const mp_int *a) MP_WUR; -*/ -/* -mp_err mp_set_double(mp_int *a, double b) MP_WUR; -*/ - -/* get integer, set integer and init with integer (int32_t) */ -#ifndef MP_NO_STDINT -/* -int32_t mp_get_i32(const mp_int *a) MP_WUR; -*/ -/* -void mp_set_i32(mp_int *a, int32_t b); -*/ -/* -mp_err mp_init_i32(mp_int *a, int32_t b) MP_WUR; -*/ - -/* get integer, set integer and init with integer, behaves like two complement for negative numbers (uint32_t) */ -#define mp_get_u32(a) ((uint32_t)mp_get_i32(a)) -/* -void mp_set_u32(mp_int *a, uint32_t b); -*/ -/* -mp_err mp_init_u32(mp_int *a, uint32_t b) MP_WUR; -*/ - -/* get integer, set integer and init with integer (int64_t) */ -/* -int64_t mp_get_i64(const mp_int *a) MP_WUR; -*/ -/* -void mp_set_i64(mp_int *a, int64_t b); -*/ -/* -mp_err mp_init_i64(mp_int *a, int64_t b) MP_WUR; -*/ - -/* get integer, set integer and init with integer, behaves like two complement for negative numbers (uint64_t) */ -#define mp_get_u64(a) ((uint64_t)mp_get_i64(a)) -/* -void mp_set_u64(mp_int *a, uint64_t b); -*/ -/* -mp_err mp_init_u64(mp_int *a, uint64_t b) MP_WUR; -*/ - -/* get magnitude */ -/* -uint32_t mp_get_mag_u32(const mp_int *a) MP_WUR; -*/ -/* -uint64_t mp_get_mag_u64(const mp_int *a) MP_WUR; -*/ -#endif -/* -unsigned long mp_get_mag_ul(const mp_int *a) MP_WUR; -*/ -/* -unsigned long long mp_get_mag_ull(const mp_int *a) MP_WUR; -*/ - -/* get integer, set integer (long) */ -/* -long mp_get_l(const mp_int *a) MP_WUR; -*/ -/* -void mp_set_l(mp_int *a, long b); -*/ -/* -mp_err mp_init_l(mp_int *a, long b) MP_WUR; -*/ - -/* get integer, set integer (unsigned long) */ -#define mp_get_ul(a) ((unsigned long)mp_get_l(a)) -/* -void mp_set_ul(mp_int *a, unsigned long b); -*/ -/* -mp_err mp_init_ul(mp_int *a, unsigned long b) MP_WUR; -*/ - -/* get integer, set integer (long long) */ -/* -long long mp_get_ll(const mp_int *a) MP_WUR; -*/ -/* -void mp_set_ll(mp_int *a, long long b); -*/ -/* -mp_err mp_init_ll(mp_int *a, long long b) MP_WUR; -*/ - -/* get integer, set integer (unsigned long long) */ -#define mp_get_ull(a) ((Tcl_WideUInt)mp_get_ll(a)) -/* -void mp_set_ull(mp_int *a, unsigned long long b); -*/ -/* -mp_err mp_init_ull(mp_int *a, unsigned long long b) MP_WUR; -*/ - -/* set to single unsigned digit, up to MP_DIGIT_MAX */ -/* -void mp_set(mp_int *a, mp_digit b); -*/ -/* -mp_err mp_init_set(mp_int *a, mp_digit b) MP_WUR; -*/ - -/* get integer, set integer and init with integer (deprecated) */ -/* -MP_DEPRECATED(mp_get_mag_u32/mp_get_u32) unsigned long mp_get_int(const mp_int *a) MP_WUR; -*/ -/* -MP_DEPRECATED(mp_get_mag_ul/mp_get_ul) unsigned long mp_get_long(const mp_int *a) MP_WUR; -*/ -/* -MP_DEPRECATED(mp_get_mag_ull/mp_get_ull) unsigned long long mp_get_long_long(const mp_int *a) MP_WUR; -*/ -/* -MP_DEPRECATED(mp_set_ul) mp_err mp_set_int(mp_int *a, unsigned long b); -*/ -/* -MP_DEPRECATED(mp_set_ul) mp_err mp_set_long(mp_int *a, unsigned long b); -*/ -/* -MP_DEPRECATED(mp_set_ull) mp_err mp_set_long_long(mp_int *a, unsigned long long b); -*/ -/* -MP_DEPRECATED(mp_init_ul) mp_err mp_init_set_int(mp_int *a, unsigned long b) MP_WUR; -*/ - -/* copy, b = a */ -/* -mp_err mp_copy(const mp_int *a, mp_int *b) MP_WUR; -*/ - -/* inits and copies, a = b */ -/* -mp_err mp_init_copy(mp_int *a, const mp_int *b) MP_WUR; -*/ - -/* trim unused digits */ -/* -void mp_clamp(mp_int *a); -*/ - - -/* export binary data */ -/* -MP_DEPRECATED(mp_pack) mp_err mp_export(void *rop, size_t *countp, int order, size_t size, - int endian, size_t nails, const mp_int *op) MP_WUR; -*/ - -/* import binary data */ -/* -MP_DEPRECATED(mp_unpack) mp_err mp_import(mp_int *rop, size_t count, int order, - size_t size, int endian, size_t nails, - const void *op) MP_WUR; -*/ - -/* unpack binary data */ -/* -mp_err mp_unpack(mp_int *rop, size_t count, mp_order order, size_t size, mp_endian endian, - size_t nails, const void *op) MP_WUR; -*/ - -/* pack binary data */ -/* -size_t mp_pack_count(const mp_int *a, size_t nails, size_t size) MP_WUR; -*/ -/* -mp_err mp_pack(void *rop, size_t maxcount, size_t *written, mp_order order, size_t size, - mp_endian endian, size_t nails, const mp_int *op) MP_WUR; -*/ - -/* ---> digit manipulation <--- */ - -/* right shift by "b" digits */ -/* -void mp_rshd(mp_int *a, int b); -*/ - -/* left shift by "b" digits */ -/* -mp_err mp_lshd(mp_int *a, int b) MP_WUR; -*/ - -/* c = a / 2**b, implemented as c = a >> b */ -/* -mp_err mp_div_2d(const mp_int *a, int b, mp_int *c, mp_int *d) MP_WUR; -*/ - -/* b = a/2 */ -/* -mp_err mp_div_2(const mp_int *a, mp_int *b) MP_WUR; -*/ - -/* a/3 => 3c + d == a */ -/* -mp_err mp_div_3(const mp_int *a, mp_int *c, mp_digit *d) MP_WUR; -*/ - -/* c = a * 2**b, implemented as c = a << b */ -/* -mp_err mp_mul_2d(const mp_int *a, int b, mp_int *c) MP_WUR; -*/ - -/* b = a*2 */ -/* -mp_err mp_mul_2(const mp_int *a, mp_int *b) MP_WUR; -*/ - -/* c = a mod 2**b */ -/* -mp_err mp_mod_2d(const mp_int *a, int b, mp_int *c) MP_WUR; -*/ - -/* computes a = 2**b */ -/* -mp_err mp_2expt(mp_int *a, int b) MP_WUR; -*/ - -/* Counts the number of lsbs which are zero before the first zero bit */ -/* -int mp_cnt_lsb(const mp_int *a) MP_WUR; -*/ - -/* I Love Earth! */ - -/* makes a pseudo-random mp_int of a given size */ -/* -mp_err mp_rand(mp_int *a, int digits) MP_WUR; -*/ -/* makes a pseudo-random small int of a given size */ -/* -MP_DEPRECATED(mp_rand) mp_err mp_rand_digit(mp_digit *r) MP_WUR; -*/ -/* use custom random data source instead of source provided the platform */ -/* -void mp_rand_source(mp_err(*source)(void *out, size_t size)); -*/ - -#ifdef MP_PRNG_ENABLE_LTM_RNG -# warning MP_PRNG_ENABLE_LTM_RNG has been deprecated, use mp_rand_source instead. -/* A last resort to provide random data on systems without any of the other - * implemented ways to gather entropy. - * It is compatible with `rng_get_bytes()` from libtomcrypt so you could - * provide that one and then set `ltm_rng = rng_get_bytes;` */ -extern unsigned long (*ltm_rng)(unsigned char *out, unsigned long outlen, void (*callback)(void)); -extern void (*ltm_rng_callback)(void); -#endif - -/* ---> binary operations <--- */ - -/* Checks the bit at position b and returns MP_YES - * if the bit is 1, MP_NO if it is 0 and MP_VAL - * in case of error - */ -/* -MP_DEPRECATED(s_mp_get_bit) int mp_get_bit(const mp_int *a, int b) MP_WUR; -*/ - -/* c = a XOR b (two complement) */ -/* -MP_DEPRECATED(mp_xor) mp_err mp_tc_xor(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; -*/ -/* -mp_err mp_xor(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; -*/ - -/* c = a OR b (two complement) */ -/* -MP_DEPRECATED(mp_or) mp_err mp_tc_or(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; -*/ -/* -mp_err mp_or(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; -*/ - -/* c = a AND b (two complement) */ -/* -MP_DEPRECATED(mp_and) mp_err mp_tc_and(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; -*/ -/* -mp_err mp_and(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; -*/ - -/* b = ~a (bitwise not, two complement) */ -/* -mp_err mp_complement(const mp_int *a, mp_int *b) MP_WUR; -*/ - -/* right shift with sign extension */ -/* -MP_DEPRECATED(mp_signed_rsh) mp_err mp_tc_div_2d(const mp_int *a, int b, mp_int *c) MP_WUR; -*/ -/* -mp_err mp_signed_rsh(const mp_int *a, int b, mp_int *c) MP_WUR; -*/ - -/* ---> Basic arithmetic <--- */ - -/* b = -a */ -/* -mp_err mp_neg(const mp_int *a, mp_int *b) MP_WUR; -*/ - -/* b = |a| */ -/* -mp_err mp_abs(const mp_int *a, mp_int *b) MP_WUR; -*/ - -/* compare a to b */ -/* -mp_ord mp_cmp(const mp_int *a, const mp_int *b) MP_WUR; -*/ - -/* compare |a| to |b| */ -/* -mp_ord mp_cmp_mag(const mp_int *a, const mp_int *b) MP_WUR; -*/ - -/* c = a + b */ -/* -mp_err mp_add(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; -*/ - -/* c = a - b */ -/* -mp_err mp_sub(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; -*/ - -/* c = a * b */ -/* -mp_err mp_mul(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; -*/ - -/* b = a*a */ -/* -mp_err mp_sqr(const mp_int *a, mp_int *b) MP_WUR; -*/ - -/* a/b => cb + d == a */ -/* -mp_err mp_div(const mp_int *a, const mp_int *b, mp_int *c, mp_int *d) MP_WUR; -*/ - -/* c = a mod b, 0 <= c < b */ -/* -mp_err mp_mod(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; -*/ - -/* Increment "a" by one like "a++". Changes input! */ -/* -mp_err mp_incr(mp_int *a) MP_WUR; -*/ - -/* Decrement "a" by one like "a--". Changes input! */ -/* -mp_err mp_decr(mp_int *a) MP_WUR; -*/ - -/* ---> single digit functions <--- */ - -/* compare against a single digit */ -/* -mp_ord mp_cmp_d(const mp_int *a, mp_digit b) MP_WUR; -*/ - -/* c = a + b */ -/* -mp_err mp_add_d(const mp_int *a, mp_digit b, mp_int *c) MP_WUR; -*/ - -/* c = a - b */ -/* -mp_err mp_sub_d(const mp_int *a, mp_digit b, mp_int *c) MP_WUR; -*/ - -/* c = a * b */ -/* -mp_err mp_mul_d(const mp_int *a, mp_digit b, mp_int *c) MP_WUR; -*/ - -/* a/b => cb + d == a */ -/* -mp_err mp_div_d(const mp_int *a, mp_digit b, mp_int *c, mp_digit *d) MP_WUR; -*/ - -/* c = a mod b, 0 <= c < b */ -/* -mp_err mp_mod_d(const mp_int *a, mp_digit b, mp_digit *c) MP_WUR; -*/ - -/* ---> number theory <--- */ - -/* d = a + b (mod c) */ -/* -mp_err mp_addmod(const mp_int *a, const mp_int *b, const mp_int *c, mp_int *d) MP_WUR; -*/ - -/* d = a - b (mod c) */ -/* -mp_err mp_submod(const mp_int *a, const mp_int *b, const mp_int *c, mp_int *d) MP_WUR; -*/ - -/* d = a * b (mod c) */ -/* -mp_err mp_mulmod(const mp_int *a, const mp_int *b, const mp_int *c, mp_int *d) MP_WUR; -*/ - -/* c = a * a (mod b) */ -/* -mp_err mp_sqrmod(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; -*/ - -/* c = 1/a (mod b) */ -/* -mp_err mp_invmod(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; -*/ - -/* c = (a, b) */ -/* -mp_err mp_gcd(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; -*/ - -/* produces value such that U1*a + U2*b = U3 */ -/* -mp_err mp_exteuclid(const mp_int *a, const mp_int *b, mp_int *U1, mp_int *U2, mp_int *U3) MP_WUR; -*/ - -/* c = [a, b] or (a*b)/(a, b) */ -/* -mp_err mp_lcm(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; -*/ - -/* finds one of the b'th root of a, such that |c|**b <= |a| - * - * returns error if a < 0 and b is even - */ -/* -mp_err mp_root_u32(const mp_int *a, unsigned int b, mp_int *c) MP_WUR; -*/ -/* -MP_DEPRECATED(mp_root_u32) mp_err mp_n_root(const mp_int *a, mp_digit b, mp_int *c) MP_WUR; -*/ -/* -MP_DEPRECATED(mp_root_u32) mp_err mp_n_root_ex(const mp_int *a, mp_digit b, mp_int *c, int fast) MP_WUR; -*/ - -/* special sqrt algo */ -/* -mp_err mp_sqrt(const mp_int *arg, mp_int *ret) MP_WUR; -*/ - -/* special sqrt (mod prime) */ -/* -mp_err mp_sqrtmod_prime(const mp_int *n, const mp_int *prime, mp_int *ret) MP_WUR; -*/ - -/* is number a square? */ -/* -mp_err mp_is_square(const mp_int *arg, mp_bool *ret) MP_WUR; -*/ - -/* computes the jacobi c = (a | n) (or Legendre if b is prime) */ -/* -MP_DEPRECATED(mp_kronecker) mp_err mp_jacobi(const mp_int *a, const mp_int *n, int *c) MP_WUR; -*/ - -/* computes the Kronecker symbol c = (a | p) (like jacobi() but with {a,p} in Z */ -/* -mp_err mp_kronecker(const mp_int *a, const mp_int *p, int *c) MP_WUR; -*/ - -/* used to setup the Barrett reduction for a given modulus b */ -/* -mp_err mp_reduce_setup(mp_int *a, const mp_int *b) MP_WUR; -*/ - -/* Barrett Reduction, computes a (mod b) with a precomputed value c - * - * Assumes that 0 < x <= m*m, note if 0 > x > -(m*m) then you can merely - * compute the reduction as -1 * mp_reduce(mp_abs(x)) [pseudo code]. - */ -/* -mp_err mp_reduce(mp_int *x, const mp_int *m, const mp_int *mu) MP_WUR; -*/ - -/* setups the montgomery reduction */ -/* -mp_err mp_montgomery_setup(const mp_int *n, mp_digit *rho) MP_WUR; -*/ - -/* computes a = B**n mod b without division or multiplication useful for - * normalizing numbers in a Montgomery system. - */ -/* -mp_err mp_montgomery_calc_normalization(mp_int *a, const mp_int *b) MP_WUR; -*/ - -/* computes x/R == x (mod N) via Montgomery Reduction */ -/* -mp_err mp_montgomery_reduce(mp_int *x, const mp_int *n, mp_digit rho) MP_WUR; -*/ - -/* returns 1 if a is a valid DR modulus */ -/* -mp_bool mp_dr_is_modulus(const mp_int *a) MP_WUR; -*/ - -/* sets the value of "d" required for mp_dr_reduce */ -/* -void mp_dr_setup(const mp_int *a, mp_digit *d); -*/ - -/* reduces a modulo n using the Diminished Radix method */ -/* -mp_err mp_dr_reduce(mp_int *x, const mp_int *n, mp_digit k) MP_WUR; -*/ - -/* returns true if a can be reduced with mp_reduce_2k */ -/* -mp_bool mp_reduce_is_2k(const mp_int *a) MP_WUR; -*/ - -/* determines k value for 2k reduction */ -/* -mp_err mp_reduce_2k_setup(const mp_int *a, mp_digit *d) MP_WUR; -*/ - -/* reduces a modulo b where b is of the form 2**p - k [0 <= a] */ -/* -mp_err mp_reduce_2k(mp_int *a, const mp_int *n, mp_digit d) MP_WUR; -*/ - -/* returns true if a can be reduced with mp_reduce_2k_l */ -/* -mp_bool mp_reduce_is_2k_l(const mp_int *a) MP_WUR; -*/ - -/* determines k value for 2k reduction */ -/* -mp_err mp_reduce_2k_setup_l(const mp_int *a, mp_int *d) MP_WUR; -*/ - -/* reduces a modulo b where b is of the form 2**p - k [0 <= a] */ -/* -mp_err mp_reduce_2k_l(mp_int *a, const mp_int *n, const mp_int *d) MP_WUR; -*/ - -/* Y = G**X (mod P) */ -/* -mp_err mp_exptmod(const mp_int *G, const mp_int *X, const mp_int *P, mp_int *Y) MP_WUR; -*/ - -/* ---> Primes <--- */ - -/* number of primes */ -#ifdef MP_8BIT -# define PRIVATE_MP_PRIME_TAB_SIZE 31 #else -# define PRIVATE_MP_PRIME_TAB_SIZE 256 -#endif -#define PRIME_SIZE (MP_DEPRECATED_PRAGMA("PRIME_SIZE has been made internal") PRIVATE_MP_PRIME_TAB_SIZE) - -/* result=1 if a is divisible by one of the first PRIME_SIZE primes */ -/* -MP_DEPRECATED(mp_prime_is_prime) mp_err mp_prime_is_divisible(const mp_int *a, mp_bool *result) MP_WUR; -*/ - -/* performs one Fermat test of "a" using base "b". - * Sets result to 0 if composite or 1 if probable prime - */ -/* -mp_err mp_prime_fermat(const mp_int *a, const mp_int *b, mp_bool *result) MP_WUR; -*/ - -/* performs one Miller-Rabin test of "a" using base "b". - * Sets result to 0 if composite or 1 if probable prime - */ -/* -mp_err mp_prime_miller_rabin(const mp_int *a, const mp_int *b, mp_bool *result) MP_WUR; -*/ - -/* 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 - */ -/* -int mp_prime_rabin_miller_trials(int size) MP_WUR; -*/ - -/* performs one strong Lucas-Selfridge test of "a". - * Sets result to 0 if composite or 1 if probable prime - */ -/* -mp_err mp_prime_strong_lucas_selfridge(const mp_int *a, mp_bool *result) MP_WUR; -*/ - -/* performs one Frobenius test of "a" as described by Paul Underwood. - * Sets result to 0 if composite or 1 if probable prime - */ -/* -mp_err mp_prime_frobenius_underwood(const mp_int *N, mp_bool *result) MP_WUR; -*/ - -/* performs t random rounds of Miller-Rabin on "a" additional to - * bases 2 and 3. Also performs an initial sieve of trial - * division. Determines if "a" is prime with probability - * of error no more than (1/4)**t. - * Both a strong Lucas-Selfridge to complete the BPSW test - * and a separate Frobenius test are available at compile time. - * With t<0 a deterministic test is run for primes up to - * 318665857834031151167461. With t<13 (abs(t)-13) additional - * tests with sequential small primes are run starting at 43. - * Is Fips 186.4 compliant if called with t as computed by - * mp_prime_rabin_miller_trials(); - * - * Sets result to 1 if probably prime, 0 otherwise - */ -/* -mp_err mp_prime_is_prime(const mp_int *a, int t, mp_bool *result) MP_WUR; -*/ - -/* 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 - */ -/* -mp_err mp_prime_next_prime(mp_int *a, int t, int bbs_style) MP_WUR; -*/ - -/* 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_DEPRECATED_PRAGMA("mp_prime_random has been deprecated, use mp_prime_rand instead") mp_prime_random_ex(a, t, ((size) * 8) + 1, (bbs==1)?MP_PRIME_BBS:0, cb, dat)) - -/* makes a truly random prime of a given size (bits), - * - * Flags are as follows: - * - * MP_PRIME_BBS - make prime congruent to 3 mod 4 - * MP_PRIME_SAFE - make sure (p-1)/2 is prime as well (implies MP_PRIME_BBS) - * MP_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 - * - */ -/* -mp_err mp_prime_rand(mp_int *a, int t, int size, int flags) MP_WUR; -*/ - -/* Integer logarithm to integer base */ -/* -mp_err mp_log_u32(const mp_int *a, unsigned int base, unsigned int *c) MP_WUR; -*/ - -/* c = a**b */ -/* -mp_err mp_expt_u32(const mp_int *a, unsigned int b, mp_int *c) MP_WUR; -*/ -/* -MP_DEPRECATED(mp_expt_u32) mp_err mp_expt_d(const mp_int *a, mp_digit b, mp_int *c) MP_WUR; -*/ -/* -MP_DEPRECATED(mp_expt_u32) mp_err mp_expt_d_ex(const mp_int *a, mp_digit b, mp_int *c, int fast) MP_WUR; -*/ - -/* ---> radix conversion <--- */ -/* -int mp_count_bits(const mp_int *a) MP_WUR; -*/ - - -/* -MP_DEPRECATED(mp_ubin_size) int mp_unsigned_bin_size(const mp_int *a) MP_WUR; -*/ -/* -MP_DEPRECATED(mp_from_ubin) mp_err mp_read_unsigned_bin(mp_int *a, const unsigned char *b, int c) MP_WUR; -*/ -/* -MP_DEPRECATED(mp_to_ubin) mp_err mp_to_unsigned_bin(const mp_int *a, unsigned char *b) MP_WUR; -*/ -/* -MP_DEPRECATED(mp_to_ubin) mp_err mp_to_unsigned_bin_n(const mp_int *a, unsigned char *b, unsigned long *outlen) MP_WUR; -*/ - -/* -MP_DEPRECATED(mp_sbin_size) int mp_signed_bin_size(const mp_int *a) MP_WUR; -*/ -/* -MP_DEPRECATED(mp_from_sbin) mp_err mp_read_signed_bin(mp_int *a, const unsigned char *b, int c) MP_WUR; -*/ -/* -MP_DEPRECATED(mp_to_sbin) mp_err mp_to_signed_bin(const mp_int *a, unsigned char *b) MP_WUR; -*/ -/* -MP_DEPRECATED(mp_to_sbin) mp_err mp_to_signed_bin_n(const mp_int *a, unsigned char *b, unsigned long *outlen) MP_WUR; -*/ - -/* -size_t mp_ubin_size(const mp_int *a) MP_WUR; -*/ -/* -mp_err mp_from_ubin(mp_int *a, const unsigned char *buf, size_t size) MP_WUR; -*/ -/* -mp_err mp_to_ubin(const mp_int *a, unsigned char *buf, size_t maxlen, size_t *written) MP_WUR; -*/ - -/* -size_t mp_sbin_size(const mp_int *a) MP_WUR; -*/ -/* -mp_err mp_from_sbin(mp_int *a, const unsigned char *buf, size_t size) MP_WUR; -*/ -/* -mp_err mp_to_sbin(const mp_int *a, unsigned char *buf, size_t maxlen, size_t *written) MP_WUR; -*/ - -/* -mp_err mp_read_radix(mp_int *a, const char *str, int radix) MP_WUR; -*/ -/* -MP_DEPRECATED(mp_to_radix) mp_err mp_toradix(const mp_int *a, char *str, int radix) MP_WUR; -*/ -/* -MP_DEPRECATED(mp_to_radix) mp_err mp_toradix_n(const mp_int *a, char *str, int radix, int maxlen) MP_WUR; -*/ -/* -mp_err mp_to_radix(const mp_int *a, char *str, size_t maxlen, size_t *written, int radix) MP_WUR; -*/ -/* -mp_err mp_radix_size(const mp_int *a, int radix, int *size) MP_WUR; -*/ - -#ifndef MP_NO_FILE -/* -mp_err mp_fread(mp_int *a, int radix, FILE *stream) MP_WUR; -*/ -/* -mp_err mp_fwrite(const mp_int *a, int radix, FILE *stream) MP_WUR; -*/ +# include "../compat/stdint.h" #endif - -#define mp_read_raw(mp, str, len) (MP_DEPRECATED_PRAGMA("replaced by mp_read_signed_bin") mp_read_signed_bin((mp), (str), (len))) -#define mp_raw_size(mp) (MP_DEPRECATED_PRAGMA("replaced by mp_signed_bin_size") mp_signed_bin_size(mp)) -#define mp_toraw(mp, str) (MP_DEPRECATED_PRAGMA("replaced by mp_to_signed_bin") mp_to_signed_bin((mp), (str))) -#define mp_read_mag(mp, str, len) (MP_DEPRECATED_PRAGMA("replaced by mp_read_unsigned_bin") mp_read_unsigned_bin((mp), (str), (len)) -#define mp_mag_size(mp) (MP_DEPRECATED_PRAGMA("replaced by mp_unsigned_bin_size") mp_unsigned_bin_size(mp)) -#define mp_tomag(mp, str) (MP_DEPRECATED_PRAGMA("replaced by mp_to_unsigned_bin") mp_to_unsigned_bin((mp), (str))) - -#define mp_tobinary(M, S) (MP_DEPRECATED_PRAGMA("replaced by mp_to_binary") mp_toradix((M), (S), 2)) -#define mp_tooctal(M, S) (MP_DEPRECATED_PRAGMA("replaced by mp_to_octal") mp_toradix((M), (S), 8)) -#define mp_todecimal(M, S) (MP_DEPRECATED_PRAGMA("replaced by mp_to_decimal") mp_toradix((M), (S), 10)) -#define mp_tohex(M, S) (MP_DEPRECATED_PRAGMA("replaced by mp_to_hex") mp_toradix((M), (S), 16)) - -#define mp_to_binary(M, S, N) mp_to_radix((M), (S), (N), NULL, 2) -#define mp_to_octal(M, S, N) mp_to_radix((M), (S), (N), NULL, 8) -#define mp_to_decimal(M, S, N) mp_to_radix((M), (S), (N), NULL, 10) -#define mp_to_hex(M, S, N) mp_to_radix((M), (S), (N), NULL, 16) - -#ifdef __cplusplus -} #endif - +#include "tommath.h" #include "tclTomMathDecls.h" #endif diff --git a/generic/tclTomMathDecls.h b/generic/tclTomMathDecls.h index e90b572..d6d8baf 100644 --- a/generic/tclTomMathDecls.h +++ b/generic/tclTomMathDecls.h @@ -16,6 +16,7 @@ #define _TCLTOMMATHDECLS #include "tcl.h" +#include <string.h> #ifndef BN_H_ #include "tclTomMath.h" #endif @@ -33,63 +34,71 @@ /* Define custom memory allocation for libtommath */ +/* MODULE_SCOPE void* TclBNAlloc( size_t ); */ +#define TclBNAlloc(s) ((void*)Tcl_Alloc(s)) +/* MODULE_SCOPE void* TclBNCalloc( size_t, size_t ); */ +#define TclBNCalloc(m,s) memset(Tcl_Alloc((size_t)(m)*(size_t)(s)),0,(size_t)(m)*(size_t)(s)) +/* MODULE_SCOPE void* TclBNRealloc( void*, size_t ); */ +#define TclBNRealloc(x,s) ((void*)Tcl_Realloc((char*)(x),(size_t)(s))) +/* MODULE_SCOPE void TclBNFree( void* ); */ +#define TclBNFree(x) (Tcl_Free((char*)(x))) + +#undef MP_MALLOC +#undef MP_CALLOC +#undef MP_REALLOC +#undef MP_FREE +#define MP_MALLOC(size) TclBNAlloc(size) +#define MP_CALLOC(nmemb, size) TclBNCalloc(nmemb, size) +#define MP_REALLOC(mem, oldsize, newsize) TclBNRealloc(mem, newsize) +#define MP_FREE(mem, size) TclBNFree(mem) + +#ifndef MODULE_SCOPE +# define MODULE_SCOPE extern +#endif -#define MP_MALLOC(size) Tcl_Alloc(size) -#define MP_CALLOC(nmemb, size) memset(Tcl_Alloc((nmemb)*(size_t)(size)),0,(nmemb)*(size_t)(size)) -#define MP_REALLOC(mem, oldsize, newsize) Tcl_Realloc(mem, newsize) -#define MP_FREE(mem, size) Tcl_Free(mem) - - -MODULE_SCOPE void TclBN_s_mp_reverse(unsigned char *s, size_t len); -MODULE_SCOPE mp_err TclBN_s_mp_add_d(const mp_int *a, mp_digit b, mp_int *c); -MODULE_SCOPE mp_ord TclBN_s_mp_cmp_d(const mp_int *a, mp_digit b); -MODULE_SCOPE mp_err TclBN_s_mp_sub_d(const mp_int *a, mp_digit b, mp_int *c); -MODULE_SCOPE mp_err TclBN_s_mp_div_d(const mp_int *a, mp_digit b, mp_int *c, mp_digit *d); -MODULE_SCOPE mp_err TclBN_s_mp_div_3(const mp_int *a, mp_int *c, mp_digit *d); -MODULE_SCOPE mp_err TclBN_s_mp_init_set(mp_int *a, mp_digit b); -MODULE_SCOPE mp_err TclBN_s_mp_mul_d(const mp_int *a, mp_digit b, mp_int *c); -MODULE_SCOPE void TclBN_s_mp_set(mp_int *a, mp_digit b); -MODULE_SCOPE mp_err TclBN_s_mp_expt_u32(const mp_int *a, unsigned int b, mp_int *c); -MODULE_SCOPE mp_err TclBN_s_mp_sqr(const mp_int *a, mp_int *c); -MODULE_SCOPE mp_err TclBN_mp_sqr(const mp_int *a, mp_int *c); - - +MODULE_SCOPE mp_err TclBN_mp_sqr(const mp_int *a, mp_int *b); +MODULE_SCOPE mp_err TclBN_mp_div_3(const mp_int *a, mp_int *q, mp_digit *r); /* Rename the global symbols in libtommath to avoid linkage conflicts */ +#ifndef TCL_WITH_EXTERNAL_TOMMATH +#define bn_reverse TclBN_reverse #define mp_add TclBN_mp_add +#define mp_add_d TclBN_mp_add_d #define mp_and TclBN_mp_and #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_d TclBN_mp_cmp_d #define mp_cmp_mag TclBN_mp_cmp_mag #define mp_cnt_lsb TclBN_mp_cnt_lsb #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_3 TclBN_s_mp_div_3 +#define mp_div_3 TclBN_mp_div_3 #define mp_div_2d TclBN_mp_div_2d #define mp_exch TclBN_mp_exch -#define mp_expt_d TclBN_mp_expt_u32 +#define mp_expt_d TclBN_mp_expt_d #define mp_expt_d_ex TclBN_mp_expt_d_ex -#define mp_get_mag_ul TclBN_mp_get_mag_ul -#define mp_get_mag_ull TclBN_mp_get_mag_ull +#define mp_expt_u32 TclBN_mp_expt_u32 +#define mp_get_mag_u64 TclBN_mp_get_mag_u64 #define mp_grow TclBN_mp_grow #define mp_init TclBN_mp_init #define mp_init_copy TclBN_mp_init_copy -#define mp_init_l TclBNInitBignumFromLong -#define mp_init_ll TclBNInitBignumFromWideInt +#define mp_init_i64 TclBN_mp_init_i64 #define mp_init_multi TclBN_mp_init_multi +#define mp_init_set TclBN_mp_init_set #define mp_init_size TclBN_mp_init_size -#define mp_init_ul TclBN_mp_init_ul -#define mp_init_ull TclBNInitBignumFromWideUInt +#define mp_init_u64 TclBN_mp_init_u64 #define mp_lshd TclBN_mp_lshd #define mp_mod TclBN_mp_mod #define mp_mod_2d TclBN_mp_mod_2d #define mp_mul TclBN_mp_mul +#define mp_mul_d TclBN_mp_mul_d #define mp_mul_2 TclBN_mp_mul_2 #define mp_mul_2d TclBN_mp_mul_2d #define mp_neg TclBN_mp_neg @@ -97,16 +106,25 @@ MODULE_SCOPE mp_err TclBN_mp_sqr(const mp_int *a, mp_int *c); #define mp_radix_size TclBN_mp_radix_size #define mp_read_radix TclBN_mp_read_radix #define mp_rshd TclBN_mp_rshd -#define mp_set_l TclBN_mp_set_l -#define mp_set_ll TclBN_mp_set_ll -#define mp_set_ul TclBN_mp_set_ul -#define mp_set_ull TclBN_mp_set_ull +#define mp_s_rmap TclBN_mp_s_rmap +#define mp_s_rmap_reverse TclBN_mp_s_rmap_reverse +#define mp_s_rmap_reverse_sz TclBN_mp_s_rmap_reverse_sz +#define mp_set TclBN_s_mp_set +#define mp_set_i64 TclBN_mp_set_i64 +#define mp_set_u64 TclBN_mp_set_u64 #define mp_shrink TclBN_mp_shrink +#define mp_sqr TclBN_mp_sqr #define mp_sqrt TclBN_mp_sqrt #define mp_sub TclBN_mp_sub +#define mp_sub_d TclBN_mp_sub_d #define mp_signed_rsh TclBN_mp_signed_rsh +#define mp_tc_and TclBN_mp_and +#define mp_tc_div_2d TclBN_mp_signed_rsh +#define mp_tc_or TclBN_mp_or +#define mp_tc_xor TclBN_mp_xor #define mp_to_unsigned_bin TclBN_mp_to_unsigned_bin #define mp_to_unsigned_bin_n TclBN_mp_to_unsigned_bin_n +#define mp_toradix_n TclBN_mp_toradix_n #define mp_to_radix TclBN_mp_to_radix #define mp_to_ubin TclBN_mp_to_ubin #define mp_ubin_size TclBN_mp_ubin_size @@ -114,7 +132,6 @@ MODULE_SCOPE mp_err TclBN_mp_sqr(const mp_int *a, mp_int *c); #define mp_zero TclBN_mp_zero #define s_mp_add TclBN_s_mp_add #define s_mp_balance_mul TclBN_mp_balance_mul -#define s_mp_div_3 TclBN_s_mp_div_3 #define s_mp_karatsuba_mul TclBN_mp_karatsuba_mul #define s_mp_karatsuba_sqr TclBN_mp_karatsuba_sqr #define s_mp_mul_digs TclBN_s_mp_mul_digs @@ -125,6 +142,7 @@ MODULE_SCOPE mp_err TclBN_mp_sqr(const mp_int *a, mp_int *c); #define s_mp_sub TclBN_s_mp_sub #define s_mp_toom_mul TclBN_mp_toom_mul #define s_mp_toom_sqr TclBN_mp_toom_sqr +#endif /* !TCL_WITH_EXTERNAL_TOMMATH */ #undef TCL_STORAGE_CLASS #ifdef BUILD_tcl @@ -161,7 +179,7 @@ EXTERN int TclBN_revision(void) MP_WUR; EXTERN mp_err TclBN_mp_add(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; /* 3 */ -EXTERN mp_err TclBN_mp_add_d(const mp_int *a, unsigned int b, +EXTERN mp_err TclBN_mp_add_d(const mp_int *a, mp_digit b, mp_int *c) MP_WUR; /* 4 */ EXTERN mp_err TclBN_mp_and(const mp_int *a, const mp_int *b, @@ -175,7 +193,7 @@ EXTERN void TclBN_mp_clear_multi(mp_int *a, ...); /* 8 */ EXTERN mp_ord TclBN_mp_cmp(const mp_int *a, const mp_int *b) MP_WUR; /* 9 */ -EXTERN mp_ord TclBN_mp_cmp_d(const mp_int *a, unsigned int b) MP_WUR; +EXTERN mp_ord TclBN_mp_cmp_d(const mp_int *a, mp_digit b) MP_WUR; /* 10 */ EXTERN mp_ord TclBN_mp_cmp_mag(const mp_int *a, const mp_int *b) MP_WUR; /* 11 */ @@ -186,8 +204,8 @@ EXTERN int TclBN_mp_count_bits(const mp_int *a) MP_WUR; EXTERN mp_err TclBN_mp_div(const mp_int *a, const mp_int *b, mp_int *q, mp_int *r) MP_WUR; /* 14 */ -EXTERN mp_err TclBN_mp_div_d(const mp_int *a, unsigned int b, - mp_int *q, unsigned int *r) MP_WUR; +EXTERN mp_err TclBN_mp_div_d(const mp_int *a, mp_digit b, + mp_int *q, mp_digit *r) MP_WUR; /* 15 */ EXTERN mp_err TclBN_mp_div_2(const mp_int *a, mp_int *q) MP_WUR; /* 16 */ @@ -197,7 +215,7 @@ EXTERN mp_err TclBN_mp_div_2d(const mp_int *a, int b, mp_int *q, /* 18 */ EXTERN void TclBN_mp_exch(mp_int *a, mp_int *b); /* 19 */ -EXTERN mp_err TclBN_mp_expt_u32(const mp_int *a, unsigned int b, +EXTERN mp_err TclBN_mp_expt_u32(const mp_int *a, uint32_t b, mp_int *c) MP_WUR; /* 20 */ EXTERN mp_err TclBN_mp_grow(mp_int *a, int size) MP_WUR; @@ -208,7 +226,7 @@ EXTERN mp_err TclBN_mp_init_copy(mp_int *a, const mp_int *b) MP_WUR; /* 23 */ EXTERN mp_err TclBN_mp_init_multi(mp_int *a, ...) MP_WUR; /* 24 */ -EXTERN mp_err TclBN_mp_init_set(mp_int *a, unsigned int b) MP_WUR; +EXTERN mp_err TclBN_mp_init_set(mp_int *a, mp_digit b) MP_WUR; /* 25 */ EXTERN mp_err TclBN_mp_init_size(mp_int *a, int size) MP_WUR; /* 26 */ @@ -222,7 +240,7 @@ EXTERN mp_err TclBN_mp_mod_2d(const mp_int *a, int b, mp_int *r) MP_WUR; EXTERN mp_err TclBN_mp_mul(const mp_int *a, const mp_int *b, mp_int *p) MP_WUR; /* 30 */ -EXTERN mp_err TclBN_mp_mul_d(const mp_int *a, unsigned int b, +EXTERN mp_err TclBN_mp_mul_d(const mp_int *a, mp_digit b, mp_int *p) MP_WUR; /* 31 */ EXTERN mp_err TclBN_mp_mul_2(const mp_int *a, mp_int *p) MP_WUR; @@ -243,8 +261,7 @@ EXTERN mp_err TclBN_mp_read_radix(mp_int *a, const char *str, EXTERN void TclBN_mp_rshd(mp_int *a, int shift); /* 38 */ EXTERN mp_err TclBN_mp_shrink(mp_int *a) MP_WUR; -/* 39 */ -EXTERN void TclBN_mp_set(mp_int *a, unsigned int b); +/* Slot 39 is reserved */ /* Slot 40 is reserved */ /* 41 */ EXTERN mp_err TclBN_mp_sqrt(const mp_int *a, mp_int *b) MP_WUR; @@ -252,7 +269,7 @@ EXTERN mp_err TclBN_mp_sqrt(const mp_int *a, mp_int *b) MP_WUR; EXTERN mp_err TclBN_mp_sub(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; /* 43 */ -EXTERN mp_err TclBN_mp_sub_d(const mp_int *a, unsigned int b, +EXTERN mp_err TclBN_mp_sub_d(const mp_int *a, mp_digit b, mp_int *c) MP_WUR; /* Slot 44 is reserved */ /* Slot 45 is reserved */ @@ -275,31 +292,24 @@ EXTERN void TclBN_mp_zero(mp_int *a); /* Slot 58 is reserved */ /* Slot 59 is reserved */ /* Slot 60 is reserved */ -/* 61 */ -EXTERN mp_err TclBN_mp_init_ul(mp_int *a, unsigned long i) MP_WUR; -/* 62 */ -EXTERN void TclBN_mp_set_ul(mp_int *a, unsigned long i); +/* Slot 61 is reserved */ +/* Slot 62 is reserved */ /* 63 */ EXTERN int TclBN_mp_cnt_lsb(const mp_int *a) MP_WUR; -/* 64 */ -EXTERN int TclBNInitBignumFromLong(mp_int *bignum, long initVal); +/* Slot 64 is reserved */ /* 65 */ -EXTERN int TclBNInitBignumFromWideInt(mp_int *bignum, - Tcl_WideInt initVal); +EXTERN int TclBN_mp_init_i64(mp_int *bignum, int64_t initVal) MP_WUR; /* 66 */ -EXTERN int TclBNInitBignumFromWideUInt(mp_int *bignum, - Tcl_WideUInt initVal); +EXTERN int TclBN_mp_init_u64(mp_int *bignum, uint64_t initVal) MP_WUR; /* Slot 67 is reserved */ /* 68 */ -EXTERN void TclBN_mp_set_ull(mp_int *a, Tcl_WideUInt i); +EXTERN void TclBN_mp_set_u64(mp_int *a, uint64_t i); /* 69 */ -EXTERN Tcl_WideUInt TclBN_mp_get_mag_ull(const mp_int *a) MP_WUR; +EXTERN uint64_t TclBN_mp_get_mag_u64(const mp_int *a) MP_WUR; /* 70 */ -EXTERN void TclBN_mp_set_ll(mp_int *a, Tcl_WideInt i); -/* 71 */ -EXTERN unsigned long TclBN_mp_get_mag_ul(const mp_int *a) MP_WUR; -/* 72 */ -EXTERN void TclBN_mp_set_l(mp_int *a, long i); +EXTERN void TclBN_mp_set_i64(mp_int *a, int64_t i); +/* Slot 71 is reserved */ +/* Slot 72 is reserved */ /* Slot 73 is reserved */ /* Slot 74 is reserved */ /* Slot 75 is reserved */ @@ -322,34 +332,34 @@ typedef struct TclTomMathStubs { int (*tclBN_epoch) (void) MP_WUR; /* 0 */ int (*tclBN_revision) (void) MP_WUR; /* 1 */ mp_err (*tclBN_mp_add) (const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; /* 2 */ - mp_err (*tclBN_mp_add_d) (const mp_int *a, unsigned int b, mp_int *c) MP_WUR; /* 3 */ + mp_err (*tclBN_mp_add_d) (const mp_int *a, mp_digit b, mp_int *c) MP_WUR; /* 3 */ mp_err (*tclBN_mp_and) (const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; /* 4 */ void (*tclBN_mp_clamp) (mp_int *a); /* 5 */ void (*tclBN_mp_clear) (mp_int *a); /* 6 */ void (*tclBN_mp_clear_multi) (mp_int *a, ...); /* 7 */ mp_ord (*tclBN_mp_cmp) (const mp_int *a, const mp_int *b) MP_WUR; /* 8 */ - mp_ord (*tclBN_mp_cmp_d) (const mp_int *a, unsigned int b) MP_WUR; /* 9 */ + mp_ord (*tclBN_mp_cmp_d) (const mp_int *a, mp_digit b) MP_WUR; /* 9 */ mp_ord (*tclBN_mp_cmp_mag) (const mp_int *a, const mp_int *b) MP_WUR; /* 10 */ mp_err (*tclBN_mp_copy) (const mp_int *a, mp_int *b) MP_WUR; /* 11 */ int (*tclBN_mp_count_bits) (const mp_int *a) MP_WUR; /* 12 */ mp_err (*tclBN_mp_div) (const mp_int *a, const mp_int *b, mp_int *q, mp_int *r) MP_WUR; /* 13 */ - mp_err (*tclBN_mp_div_d) (const mp_int *a, unsigned int b, mp_int *q, unsigned int *r) MP_WUR; /* 14 */ + mp_err (*tclBN_mp_div_d) (const mp_int *a, mp_digit b, mp_int *q, mp_digit *r) MP_WUR; /* 14 */ mp_err (*tclBN_mp_div_2) (const mp_int *a, mp_int *q) MP_WUR; /* 15 */ mp_err (*tclBN_mp_div_2d) (const mp_int *a, int b, mp_int *q, mp_int *r) MP_WUR; /* 16 */ void (*reserved17)(void); void (*tclBN_mp_exch) (mp_int *a, mp_int *b); /* 18 */ - mp_err (*tclBN_mp_expt_u32) (const mp_int *a, unsigned int b, mp_int *c) MP_WUR; /* 19 */ + mp_err (*tclBN_mp_expt_u32) (const mp_int *a, uint32_t b, mp_int *c) MP_WUR; /* 19 */ mp_err (*tclBN_mp_grow) (mp_int *a, int size) MP_WUR; /* 20 */ mp_err (*tclBN_mp_init) (mp_int *a) MP_WUR; /* 21 */ mp_err (*tclBN_mp_init_copy) (mp_int *a, const mp_int *b) MP_WUR; /* 22 */ mp_err (*tclBN_mp_init_multi) (mp_int *a, ...) MP_WUR; /* 23 */ - mp_err (*tclBN_mp_init_set) (mp_int *a, unsigned int b) MP_WUR; /* 24 */ + mp_err (*tclBN_mp_init_set) (mp_int *a, mp_digit b) MP_WUR; /* 24 */ mp_err (*tclBN_mp_init_size) (mp_int *a, int size) MP_WUR; /* 25 */ mp_err (*tclBN_mp_lshd) (mp_int *a, int shift) MP_WUR; /* 26 */ mp_err (*tclBN_mp_mod) (const mp_int *a, const mp_int *b, mp_int *r) MP_WUR; /* 27 */ mp_err (*tclBN_mp_mod_2d) (const mp_int *a, int b, mp_int *r) MP_WUR; /* 28 */ mp_err (*tclBN_mp_mul) (const mp_int *a, const mp_int *b, mp_int *p) MP_WUR; /* 29 */ - mp_err (*tclBN_mp_mul_d) (const mp_int *a, unsigned int b, mp_int *p) MP_WUR; /* 30 */ + mp_err (*tclBN_mp_mul_d) (const mp_int *a, mp_digit b, mp_int *p) MP_WUR; /* 30 */ mp_err (*tclBN_mp_mul_2) (const mp_int *a, mp_int *p) MP_WUR; /* 31 */ mp_err (*tclBN_mp_mul_2d) (const mp_int *a, int d, mp_int *p) MP_WUR; /* 32 */ mp_err (*tclBN_mp_neg) (const mp_int *a, mp_int *b) MP_WUR; /* 33 */ @@ -358,11 +368,11 @@ typedef struct TclTomMathStubs { mp_err (*tclBN_mp_read_radix) (mp_int *a, const char *str, int radix) MP_WUR; /* 36 */ void (*tclBN_mp_rshd) (mp_int *a, int shift); /* 37 */ mp_err (*tclBN_mp_shrink) (mp_int *a) MP_WUR; /* 38 */ - void (*tclBN_mp_set) (mp_int *a, unsigned int b); /* 39 */ + void (*reserved39)(void); void (*reserved40)(void); mp_err (*tclBN_mp_sqrt) (const mp_int *a, mp_int *b) MP_WUR; /* 41 */ mp_err (*tclBN_mp_sub) (const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; /* 42 */ - mp_err (*tclBN_mp_sub_d) (const mp_int *a, unsigned int b, mp_int *c) MP_WUR; /* 43 */ + mp_err (*tclBN_mp_sub_d) (const mp_int *a, mp_digit b, mp_int *c) MP_WUR; /* 43 */ void (*reserved44)(void); void (*reserved45)(void); void (*reserved46)(void); @@ -380,18 +390,18 @@ typedef struct TclTomMathStubs { void (*reserved58)(void); void (*reserved59)(void); void (*reserved60)(void); - mp_err (*tclBN_mp_init_ul) (mp_int *a, unsigned long i) MP_WUR; /* 61 */ - void (*tclBN_mp_set_ul) (mp_int *a, unsigned long i); /* 62 */ + void (*reserved61)(void); + void (*reserved62)(void); int (*tclBN_mp_cnt_lsb) (const mp_int *a) MP_WUR; /* 63 */ - int (*tclBNInitBignumFromLong) (mp_int *bignum, long initVal); /* 64 */ - int (*tclBNInitBignumFromWideInt) (mp_int *bignum, Tcl_WideInt initVal); /* 65 */ - int (*tclBNInitBignumFromWideUInt) (mp_int *bignum, Tcl_WideUInt initVal); /* 66 */ + void (*reserved64)(void); + int (*tclBN_mp_init_i64) (mp_int *bignum, int64_t initVal) MP_WUR; /* 65 */ + int (*tclBN_mp_init_u64) (mp_int *bignum, uint64_t initVal) MP_WUR; /* 66 */ void (*reserved67)(void); - void (*tclBN_mp_set_ull) (mp_int *a, Tcl_WideUInt i); /* 68 */ - Tcl_WideUInt (*tclBN_mp_get_mag_ull) (const mp_int *a) MP_WUR; /* 69 */ - void (*tclBN_mp_set_ll) (mp_int *a, Tcl_WideInt i); /* 70 */ - unsigned long (*tclBN_mp_get_mag_ul) (const mp_int *a) MP_WUR; /* 71 */ - void (*tclBN_mp_set_l) (mp_int *a, long i); /* 72 */ + void (*tclBN_mp_set_u64) (mp_int *a, uint64_t i); /* 68 */ + uint64_t (*tclBN_mp_get_mag_u64) (const mp_int *a) MP_WUR; /* 69 */ + void (*tclBN_mp_set_i64) (mp_int *a, int64_t i); /* 70 */ + void (*reserved71)(void); + void (*reserved72)(void); void (*reserved73)(void); void (*reserved74)(void); void (*reserved75)(void); @@ -491,8 +501,7 @@ extern const TclTomMathStubs *tclTomMathStubsPtr; (tclTomMathStubsPtr->tclBN_mp_rshd) /* 37 */ #define TclBN_mp_shrink \ (tclTomMathStubsPtr->tclBN_mp_shrink) /* 38 */ -#define TclBN_mp_set \ - (tclTomMathStubsPtr->tclBN_mp_set) /* 39 */ +/* Slot 39 is reserved */ /* Slot 40 is reserved */ #define TclBN_mp_sqrt \ (tclTomMathStubsPtr->tclBN_mp_sqrt) /* 41 */ @@ -520,29 +529,24 @@ extern const TclTomMathStubs *tclTomMathStubsPtr; /* Slot 58 is reserved */ /* Slot 59 is reserved */ /* Slot 60 is reserved */ -#define TclBN_mp_init_ul \ - (tclTomMathStubsPtr->tclBN_mp_init_ul) /* 61 */ -#define TclBN_mp_set_ul \ - (tclTomMathStubsPtr->tclBN_mp_set_ul) /* 62 */ +/* Slot 61 is reserved */ +/* Slot 62 is reserved */ #define TclBN_mp_cnt_lsb \ (tclTomMathStubsPtr->tclBN_mp_cnt_lsb) /* 63 */ -#define TclBNInitBignumFromLong \ - (tclTomMathStubsPtr->tclBNInitBignumFromLong) /* 64 */ -#define TclBNInitBignumFromWideInt \ - (tclTomMathStubsPtr->tclBNInitBignumFromWideInt) /* 65 */ -#define TclBNInitBignumFromWideUInt \ - (tclTomMathStubsPtr->tclBNInitBignumFromWideUInt) /* 66 */ +/* Slot 64 is reserved */ +#define TclBN_mp_init_i64 \ + (tclTomMathStubsPtr->tclBN_mp_init_i64) /* 65 */ +#define TclBN_mp_init_u64 \ + (tclTomMathStubsPtr->tclBN_mp_init_u64) /* 66 */ /* Slot 67 is reserved */ -#define TclBN_mp_set_ull \ - (tclTomMathStubsPtr->tclBN_mp_set_ull) /* 68 */ -#define TclBN_mp_get_mag_ull \ - (tclTomMathStubsPtr->tclBN_mp_get_mag_ull) /* 69 */ -#define TclBN_mp_set_ll \ - (tclTomMathStubsPtr->tclBN_mp_set_ll) /* 70 */ -#define TclBN_mp_get_mag_ul \ - (tclTomMathStubsPtr->tclBN_mp_get_mag_ul) /* 71 */ -#define TclBN_mp_set_l \ - (tclTomMathStubsPtr->tclBN_mp_set_l) /* 72 */ +#define TclBN_mp_set_u64 \ + (tclTomMathStubsPtr->tclBN_mp_set_u64) /* 68 */ +#define TclBN_mp_get_mag_u64 \ + (tclTomMathStubsPtr->tclBN_mp_get_mag_u64) /* 69 */ +#define TclBN_mp_set_i64 \ + (tclTomMathStubsPtr->tclBN_mp_set_i64) /* 70 */ +/* Slot 71 is reserved */ +/* Slot 72 is reserved */ /* Slot 73 is reserved */ /* Slot 74 is reserved */ /* Slot 75 is reserved */ @@ -559,37 +563,36 @@ extern const TclTomMathStubs *tclTomMathStubsPtr; /* !END!: Do not edit above this line. */ -#if defined(USE_TCL_STUBS) -#define mp_add_d TclBN_mp_add_d -#define mp_cmp_d TclBN_mp_cmp_d -#define mp_div_d TclBN_mp_div_d -#define mp_sub_d TclBN_mp_sub_d -#define mp_init_set TclBN_mp_init_set -#define mp_mul_d TclBN_mp_mul_d -#define mp_set TclBN_mp_set -#define mp_expt_u32 TclBN_mp_expt_u32 -#else -#define mp_add_d TclBN_s_mp_add_d -#define mp_cmp_d TclBN_s_mp_cmp_d -#define mp_div_d TclBN_s_mp_div_d -#define mp_sub_d TclBN_s_mp_sub_d -#define mp_init_set TclBN_s_mp_init_set -#define mp_mul_d TclBN_s_mp_mul_d -#define mp_set TclBN_s_mp_set -#define mp_expt_u32 TclBN_s_mp_expt_u32 -#endif /* !BUILD_tcl */ +#undef mp_get_ll +#define mp_get_ll(a) ((long long)mp_get_i64(a)) +#undef mp_set_ll +#define mp_set_ll(a,b) mp_set_i64(a,b) +#undef mp_init_ll +#define mp_init_ll(a,b) mp_init_i64(a,b) +#undef mp_get_ull +#define mp_get_ull(a) ((unsigned long long)mp_get_i64(a)) +#undef mp_set_ull +#define mp_set_ull(a,b) mp_set_u64(a,b) +#undef mp_init_ull +#define mp_init_ull(a,b) mp_init_u64(a,b) +#undef mp_set +#define mp_set(a,b) mp_set_i64((a),(int32_t)(b)) +#define mp_set_i32(a,b) mp_set_i64((a),(int32_t)(b)) +#define mp_set_l(a,b) mp_set_i64((a),(long)(b)) +#define mp_set_u32(a,b) mp_set_u64((a),(uint32_t)(b)) +#define mp_set_ul(a,b) mp_set_u64((a),(unsigned long)(b)) +#define mp_init_i32(a,b) mp_init_i64((a),(int32_t)(b)) +#define mp_init_l(a,b) mp_init_i64((a),(long)(b)) +#define mp_init_u32(a,b) mp_init_u64((a),(uint32_t)(b)) +#define mp_init_ul(a,b) mp_init_u64((a),(unsigned long)(b)) +#undef mp_iseven +#undef mp_isodd +#define mp_iseven(a) (!mp_isodd(a)) +#define mp_isodd(a) (((a)->used != 0 && (((a)->dp[0] & 1) != 0)) ? MP_YES : MP_NO) +#undef mp_sqr +#define mp_sqr(a,b) mp_mul(a,a,b) #undef TCL_STORAGE_CLASS #define TCL_STORAGE_CLASS DLLIMPORT -#if defined(USE_TCL_STUBS) -# define mp_sqr(a,b) mp_mul(a,a,b) -#else -# define mp_sqr TclBN_mp_sqr -#endif - -#define mp_init_i32(a,b) mp_init_l((a),(int32_t)(b)) -#define mp_init_i64(a,b) mp_init_ll((a),(b)) -#define mp_init_u32(a,b) mp_init_ull((a),(uint32_t)(b)) -#define mp_init_u64(a,b) mp_init_ull((a),(b)) #endif /* _TCLINTDECLS */ diff --git a/generic/tclTomMathInterface.c b/generic/tclTomMathInterface.c index 576929c..60ed123 100644 --- a/generic/tclTomMathInterface.c +++ b/generic/tclTomMathInterface.c @@ -13,7 +13,7 @@ */ #include "tclInt.h" -#include "tommath.h" +#include "tclTomMath.h" MODULE_SCOPE const TclTomMathStubs tclTomMathStubs; diff --git a/generic/tclTomMathStubLib.c b/generic/tclTomMathStubLib.c index 715904c..7bebe12 100644 --- a/generic/tclTomMathStubLib.c +++ b/generic/tclTomMathStubLib.c @@ -12,6 +12,7 @@ */ #include "tclInt.h" +#include "tclTomMath.h" MODULE_SCOPE const TclTomMathStubs *tclTomMathStubsPtr; diff --git a/generic/tclUtil.c b/generic/tclUtil.c index 200e319..e1e2486 100644 --- a/generic/tclUtil.c +++ b/generic/tclUtil.c @@ -15,7 +15,7 @@ #include "tclInt.h" #include "tclParse.h" #include "tclStringTrim.h" -#include "tommath.h" +#include "tclTomMath.h" #include <math.h> /* @@ -3307,48 +3307,24 @@ TclFormatInt( * formatted characters are written. */ Tcl_WideInt n) /* The integer to format. */ { - Tcl_WideInt intVal; - size_t i, numFormatted, j; - const char *digits = "0123456789"; - - /* - * Check first whether "n" is zero. - */ - - if (n == 0) { - buffer[0] = '0'; - buffer[1] = 0; - return 1; - } - - /* - * Check whether "n" is the maximum negative value. This is -2^(m-1) for - * an m-bit word, and has no positive equivalent; negating it produces the - * same value. - */ - - intVal = -n; /* [Bug 3390638] Workaround for*/ - if (n == -n || intVal == n) { /* broken compiler optimizers. */ - return sprintf(buffer, "%" TCL_LL_MODIFIER "d", n); - } + Tcl_WideUInt intVal; + size_t i = 0, numFormatted, j; + static const char digits[] = "0123456789"; /* * Generate the characters of the result backwards in the buffer. */ - intVal = (n < 0? -n : n); - i = 0; - buffer[0] = '\0'; + intVal = (n < 0 ? -(Tcl_WideUInt)n : (Tcl_WideUInt)n); do { - i++; - buffer[i] = digits[intVal % 10]; - intVal = intVal/10; + buffer[i++] = digits[intVal % 10]; + intVal = intVal / 10; } while (intVal > 0); if (n < 0) { - i++; - buffer[i] = '-'; + buffer[i++] = '-'; } - numFormatted = i; + buffer[i] = '\0'; + numFormatted = i--; /* * Now reverse the characters. diff --git a/generic/tclZipfs.c b/generic/tclZipfs.c index 06b9cea..84c10c7 100644 --- a/generic/tclZipfs.c +++ b/generic/tclZipfs.c @@ -430,7 +430,7 @@ static const Tcl_Filesystem zipfsFilesystem = { NULL, /* renameFileProc */ NULL, /* copyDirectoryProc */ NULL, /* lstatProc */ - (Tcl_FSLoadFileProc *) ZipFSLoadFile, + (Tcl_FSLoadFileProc *)(void *)ZipFSLoadFile, NULL, /* getCwdProc */ NULL, /* chdirProc */ }; @@ -3172,7 +3172,7 @@ TclZipfs_TclLibrary(void) #ifdef _WIN32 HMODULE hModule; WCHAR wName[MAX_PATH + LIBRARY_SIZE]; - char dllName[(MAX_PATH + LIBRARY_SIZE) * TCL_UTF_MAX]; + char dllName[(MAX_PATH + LIBRARY_SIZE) * 3]; #endif /* _WIN32 */ /* @@ -4682,7 +4682,7 @@ ZipFSLoadFile( Tcl_DecrRefCount(objs[1]); } - loadFileProc = (Tcl_FSLoadFileProc2 *) tclNativeFilesystem.loadFileProc; + loadFileProc = (Tcl_FSLoadFileProc2 *)(void *)tclNativeFilesystem.loadFileProc; if (loadFileProc) { ret = loadFileProc(interp, path, loadHandle, unloadProcPtr, flags); } else { diff --git a/generic/tommath.h b/generic/tommath.h deleted file mode 100644 index 028a84d..0000000 --- a/generic/tommath.h +++ /dev/null @@ -1 +0,0 @@ -#include "tclTomMathInt.h" diff --git a/library/encoding/tis-620.enc b/library/encoding/tis-620.enc index c233be5..2e9142a 100644 --- a/library/encoding/tis-620.enc +++ b/library/encoding/tis-620.enc @@ -17,4 +17,4 @@ S 0E200E210E220E230E240E250E260E270E280E290E2A0E2B0E2C0E2D0E2E0E2F 0E300E310E320E330E340E350E360E370E380E390E3A00000000000000000E3F 0E400E410E420E430E440E450E460E470E480E490E4A0E4B0E4C0E4D0E4E0E4F -0E500E510E520E530E540E550E560E570E580E590E5A0E5B0000000000000000
\ No newline at end of file +0E500E510E520E530E540E550E560E570E580E590E5A0E5B0000000000000000 diff --git a/library/init.tcl b/library/init.tcl index 9ca3eba..790ff73 100644 --- a/library/init.tcl +++ b/library/init.tcl @@ -19,7 +19,7 @@ if {[info commands package] == ""} { error "version mismatch: library\nscripts expect Tcl version 7.5b1 or later but the loaded version is\nonly [info patchlevel]" } -package require -exact Tcl 9.0a1 +package require -exact Tcl 9.0a2 # Compute the auto path to use in this interpreter. # The values on the path come from several locations: diff --git a/library/tcltest/pkgIndex.tcl b/library/tcltest/pkgIndex.tcl index ca93725..4aa3970 100644 --- a/library/tcltest/pkgIndex.tcl +++ b/library/tcltest/pkgIndex.tcl @@ -9,4 +9,4 @@ # full path name of this file's directory. if {![package vsatisfies [package provide Tcl] 8.5-]} {return} -package ifneeded tcltest 2.5.1 [list source [file join $dir tcltest.tcl]] +package ifneeded tcltest 2.5.2 [list source [file join $dir tcltest.tcl]] diff --git a/library/tcltest/tcltest.tcl b/library/tcltest/tcltest.tcl index 820e978..c51467b 100644 --- a/library/tcltest/tcltest.tcl +++ b/library/tcltest/tcltest.tcl @@ -22,7 +22,7 @@ namespace eval tcltest { # When the version number changes, be sure to update the pkgIndex.tcl file, # and the install directory in the Makefiles. When the minor version # changes (new feature) be sure to update the man page as well. - variable Version 2.5.1 + variable Version 2.5.2 # Compatibility support for dumb variables defined in tcltest 1 # Do not use these. Call [package provide Tcl] and [info patchlevel] @@ -1982,18 +1982,24 @@ proc tcltest::test {name description args} { } } - # First, run the setup script - set code [catch { - uplevel 1 [list [namespace which SetupTest] $setup] - } setupMsg] + # First, run the setup script (or a hook if it presents): + if {[set cmd [namespace which -command [namespace current]::SetupTest]] ne ""} { + set setup [list $cmd $setup] + } + set processTest 1 + set code [catch {uplevel 1 $setup} setupMsg] if {$code == 1} { set errorInfo(setup) $::errorInfo set errorCodeRes(setup) $::errorCode + if {$errorCodeRes(setup) eq "BYPASS-SKIPPED-TEST"} { + _noticeSkipped $name $setupMsg + set processTest [set code 0] + } } set setupFailure [expr {$code != 0}] # Only run the test body if the setup was successful - if {!$setupFailure} { + if {$processTest && !$setupFailure} { # Register startup time if {[IsVerbose msec] || [IsVerbose usec]} { @@ -2016,16 +2022,20 @@ proc tcltest::test {name description args} { if {$returnCode == 1} { set errorInfo(body) $::errorInfo set errorCodeRes(body) $::errorCode + if {$errorCodeRes(body) eq "BYPASS-SKIPPED-TEST"} { + _noticeSkipped $name $actualAnswer + set processTest [set returnCode 0] + } } } # check if the return code matched the expected return code set codeFailure 0 - if {!$setupFailure && ($returnCode ni $returnCodes)} { + if {$processTest && !$setupFailure && ($returnCode ni $returnCodes)} { set codeFailure 1 } set errorCodeFailure 0 - if {!$setupFailure && !$codeFailure && $returnCode == 1 && \ + if {$processTest && !$setupFailure && !$codeFailure && $returnCode == 1 && \ ![string match $errorCode $errorCodeRes(body)]} { set errorCodeFailure 1 } @@ -2034,7 +2044,7 @@ proc tcltest::test {name description args} { # them. If the comparison fails, then so did the test. set outputFailure 0 variable outData - if {[info exists output] && !$codeFailure} { + if {$processTest && [info exists output] && !$codeFailure} { if {[set outputCompare [catch { CompareStrings $outData $output $match } outputMatch]] == 0} { @@ -2046,7 +2056,7 @@ proc tcltest::test {name description args} { set errorFailure 0 variable errData - if {[info exists errorOutput] && !$codeFailure} { + if {$processTest && [info exists errorOutput] && !$codeFailure} { if {[set errorCompare [catch { CompareStrings $errData $errorOutput $match } errorMatch]] == 0} { @@ -2058,7 +2068,9 @@ proc tcltest::test {name description args} { # check if the answer matched the expected answer # Only check if we ran the body of the test (no setup failure) - if {$setupFailure || $codeFailure} { + if {!$processTest} { + set scriptFailure 0 + } elseif {$setupFailure || $codeFailure} { set scriptFailure 0 } elseif {[set scriptCompare [catch { CompareStrings $actualAnswer $result $match @@ -2068,7 +2080,10 @@ proc tcltest::test {name description args} { set scriptFailure 1 } - # Always run the cleanup script + # Always run the cleanup script (or a hook if it presents): + if {[set cmd [namespace which -command [namespace current]::CleanupTest]] ne ""} { + set cleanup [list $cmd $cleanup] + } set code [catch {uplevel 1 $cleanup} cleanupMsg] if {$code == 1} { set errorInfo(cleanup) $::errorInfo @@ -2119,6 +2134,12 @@ proc tcltest::test {name description args} { } } + # if skipped, it is safe to return here + if {!$processTest} { + incr testLevel -1 + return + } + # if we didn't experience any failures, then we passed variable numTests if {!($setupFailure || $cleanupFailure || $coreFailure @@ -2179,7 +2200,7 @@ proc tcltest::test {name description args} { puts [outputChannel] "---- errorCode(setup): $errorCodeRes(setup)" } } - if {$scriptFailure} { + if {$processTest && $scriptFailure} { if {$scriptCompare} { puts [outputChannel] "---- Error testing result: $scriptMatch" } else { @@ -2246,6 +2267,32 @@ proc tcltest::test {name description args} { return } +# Skip -- +# +# Skips a running test and add a reason to skipped "constraints". Can be used +# to conditional intended abort of the test. +# +# Side Effects: Maintains tally of total tests seen and tests skipped. +# +proc tcltest::Skip {reason} { + return -code error -errorcode BYPASS-SKIPPED-TEST $reason +} + +proc tcltest::_noticeSkipped {name reason} { + variable testLevel + variable numTests + + if {[IsVerbose skip]} { + puts [outputChannel] "++++ $name SKIPPED: $reason" + } + + if {$testLevel == 1} { + incr numTests(Skipped) + AddToSkippedBecause $reason + } +} + + # Skipped -- # # Given a test name and it constraints, returns a boolean indicating @@ -2326,22 +2373,13 @@ proc tcltest::Skipped {name constraints} { } if {!$doTest} { - if {[IsVerbose skip]} { - puts [outputChannel] "++++ $name SKIPPED: $constraints" - } - - if {$testLevel == 1} { - incr numTests(Skipped) - AddToSkippedBecause $constraints - } + _noticeSkipped $name $constraints return 1 } } return 0 } - - # RunTest -- # # This is where the body of a test is evaluated. The combination of @@ -2358,21 +2396,15 @@ proc tcltest::RunTest {name script} { memory tag $name } + # run the test script (or a hook if it presents): + if {[set cmd [namespace which -command [namespace current]::EvalTest]] ne ""} { + set script [list $cmd $script] + } set code [catch {uplevel 1 $script} actualAnswer] return [list $actualAnswer $code] } - - -# SetupTest -- -# -# Evaluates the -setup script for a test - -proc tcltest::SetupTest setup { - uplevel 1 $setup -} - ##################################################################### # tcltest::cleanupTestsHook -- diff --git a/libtommath/appveyor.yml b/libtommath/appveyor.yml index 187a09a..08bb013 100644 --- a/libtommath/appveyor.yml +++ b/libtommath/appveyor.yml @@ -4,6 +4,7 @@ branches: - master - develop - /^release/ + - /^support/ - /^travis/ image: - Visual Studio 2019 diff --git a/libtommath/bn_deprecated.c b/libtommath/bn_deprecated.c index 873414e..2056b20 100644 --- a/libtommath/bn_deprecated.c +++ b/libtommath/bn_deprecated.c @@ -25,7 +25,7 @@ mp_err mp_jacobi(const mp_int *a, const mp_int *n, int *c) } #endif #ifdef BN_MP_PRIME_RANDOM_EX_C -mp_err mp_prime_random_ex(mp_int *a, int t, int size, int flags, mp_prime_callback cb, void *dat) +mp_err mp_prime_random_ex(mp_int *a, int t, int size, int flags, private_mp_prime_callback cb, void *dat) { return s_mp_prime_random_ex(a, t, size, flags, cb, dat); } @@ -158,14 +158,14 @@ mp_err mp_set_int(mp_int *a, unsigned long b) #ifdef BN_MP_SET_LONG_C mp_err mp_set_long(mp_int *a, unsigned long b) { - mp_set_ul(a, b); + mp_set_u64(a, b); return MP_OKAY; } #endif #ifdef BN_MP_SET_LONG_LONG_C mp_err mp_set_long_long(mp_int *a, unsigned long long b) { - mp_set_ull(a, b); + mp_set_u64(a, b); return MP_OKAY; } #endif @@ -219,7 +219,7 @@ mp_err mp_n_root_ex(const mp_int *a, mp_digit b, mp_int *c, int fast) if (b > MP_MIN(MP_DIGIT_MAX, UINT32_MAX)) { return MP_VAL; } - return mp_root_u32(a, (unsigned int)b, c); + return mp_root_u32(a, (uint32_t)b, c); } #endif #ifdef BN_MP_N_ROOT_C @@ -228,7 +228,7 @@ mp_err mp_n_root(const mp_int *a, mp_digit b, mp_int *c) if (b > MP_MIN(MP_DIGIT_MAX, UINT32_MAX)) { return MP_VAL; } - return mp_root_u32(a, (unsigned int)b, c); + return mp_root_u32(a, (uint32_t)b, c); } #endif #ifdef BN_MP_UNSIGNED_BIN_SIZE_C diff --git a/libtommath/bn_mp_expt_u32.c b/libtommath/bn_mp_expt_u32.c index 67c8fd2..2ab67ba 100644 --- a/libtommath/bn_mp_expt_u32.c +++ b/libtommath/bn_mp_expt_u32.c @@ -4,7 +4,7 @@ /* SPDX-License-Identifier: Unlicense */ /* calculate c = a**b using a square-multiply algorithm */ -mp_err mp_expt_u32(const mp_int *a, unsigned int b, mp_int *c) +mp_err mp_expt_u32(const mp_int *a, uint32_t b, mp_int *c) { mp_err err; diff --git a/libtommath/bn_mp_fread.c b/libtommath/bn_mp_fread.c index 1e5ecf7..52ea773 100644 --- a/libtommath/bn_mp_fread.c +++ b/libtommath/bn_mp_fread.c @@ -30,11 +30,11 @@ mp_err mp_fread(mp_int *a, int radix, FILE *stream) do { int y; unsigned pos = (unsigned)(ch - (int)'('); - if (MP_RMAP_REVERSE_SIZE < pos) { + if (mp_s_rmap_reverse_sz < pos) { break; } - y = (int)s_mp_rmap_reverse[pos]; + y = (int)mp_s_rmap_reverse[pos]; if ((y == 0xff) || (y >= radix)) { break; diff --git a/libtommath/bn_mp_init_ll.c b/libtommath/bn_mp_init_ll.c index 484d51c..dc7c4a4 100644 --- a/libtommath/bn_mp_init_ll.c +++ b/libtommath/bn_mp_init_ll.c @@ -3,5 +3,5 @@ /* LibTomMath, multiple-precision integer library -- Tom St Denis */ /* SPDX-License-Identifier: Unlicense */ -MP_INIT_INT(mp_init_ll, mp_set_ll, Tcl_WideInt) +MP_INIT_INT(mp_init_ll, mp_set_ll, long long) #endif diff --git a/libtommath/bn_mp_init_ull.c b/libtommath/bn_mp_init_ull.c index 92ad9f9..84110c0 100644 --- a/libtommath/bn_mp_init_ull.c +++ b/libtommath/bn_mp_init_ull.c @@ -3,5 +3,5 @@ /* LibTomMath, multiple-precision integer library -- Tom St Denis */ /* SPDX-License-Identifier: Unlicense */ -MP_INIT_INT(mp_init_ull, mp_set_ull, Tcl_WideUInt) +MP_INIT_INT(mp_init_ull, mp_set_ull, unsigned long long) #endif diff --git a/libtommath/bn_mp_log_u32.c b/libtommath/bn_mp_log_u32.c index f507b1d..b86d789 100644 --- a/libtommath/bn_mp_log_u32.c +++ b/libtommath/bn_mp_log_u32.c @@ -6,7 +6,7 @@ /* Compute log_{base}(a) */ static mp_word s_pow(mp_word base, mp_word exponent) { - mp_word result = 1; + mp_word result = 1u; while (exponent != 0u) { if ((exponent & 1u) == 1u) { result *= base; @@ -20,8 +20,8 @@ static mp_word s_pow(mp_word base, mp_word exponent) static mp_digit s_digit_ilogb(mp_digit base, mp_digit n) { - mp_word bracket_low = 1, bracket_mid, bracket_high, N; - mp_digit ret, high = 1uL, low = 0uL, mid; + mp_word bracket_low = 1u, bracket_mid, bracket_high, N; + mp_digit ret, high = 1u, low = 0uL, mid; if (n < base) { return 0uL; @@ -40,7 +40,7 @@ static mp_digit s_digit_ilogb(mp_digit base, mp_digit n) bracket_high *= bracket_high; } - while (((mp_digit)(high - low)) > 1uL) { + while (((mp_digit)(high - low)) > 1u) { mid = (low + high) >> 1; bracket_mid = bracket_low * s_pow(base, (mp_word)(mid - low)); @@ -70,11 +70,11 @@ static mp_digit s_digit_ilogb(mp_digit base, mp_digit n) as is the output of mp_bitcount. With the same problem: max size is INT_MAX * MP_DIGIT not INT_MAX only! */ -mp_err mp_log_u32(const mp_int *a, unsigned int base, unsigned int *c) +mp_err mp_log_u32(const mp_int *a, uint32_t base, uint32_t *c) { mp_err err; mp_ord cmp; - unsigned int high, low, mid; + uint32_t high, low, mid; mp_int bracket_low, bracket_high, bracket_mid, t, bi_base; err = MP_OKAY; @@ -98,12 +98,12 @@ mp_err mp_log_u32(const mp_int *a, unsigned int base, unsigned int *c) base >>= 1; } bit_count = mp_count_bits(a) - 1; - *c = (unsigned int)(bit_count/y); + *c = (uint32_t)(bit_count/y); return MP_OKAY; } if (a->used == 1) { - *c = (unsigned int)s_digit_ilogb(base, a->dp[0]); + *c = (uint32_t)s_digit_ilogb(base, a->dp[0]); return err; } @@ -146,7 +146,7 @@ mp_err mp_log_u32(const mp_int *a, unsigned int base, unsigned int *c) while ((high - low) > 1u) { mid = (high + low) >> 1; - if ((err = mp_expt_u32(&bi_base, mid - low, &t)) != MP_OKAY) { + if ((err = mp_expt_u32(&bi_base, (uint32_t)(mid - low), &t)) != MP_OKAY) { goto LBL_ERR; } if ((err = mp_mul(&bracket_low, &t, &bracket_mid)) != MP_OKAY) { diff --git a/libtommath/bn_mp_montgomery_reduce.c b/libtommath/bn_mp_montgomery_reduce.c index 3ce1f15..ffe8341 100644 --- a/libtommath/bn_mp_montgomery_reduce.c +++ b/libtommath/bn_mp_montgomery_reduce.c @@ -17,8 +17,8 @@ mp_err mp_montgomery_reduce(mp_int *x, const mp_int *n, mp_digit rho) * are fixed up in the inner loop. */ digs = (n->used * 2) + 1; - if ((digs < PRIVATE_MP_WARRAY) && - (x->used <= PRIVATE_MP_WARRAY) && + if ((digs < MP_WARRAY) && + (x->used <= MP_WARRAY) && (n->used < MP_MAXFAST)) { return s_mp_montgomery_reduce_fast(x, n, rho); } diff --git a/libtommath/bn_mp_mul.c b/libtommath/bn_mp_mul.c index c4890c5..b00334d 100644 --- a/libtommath/bn_mp_mul.c +++ b/libtommath/bn_mp_mul.c @@ -19,7 +19,7 @@ mp_err mp_mul(const mp_int *a, const mp_int *b, mp_int *c) * The bigger one needs to be at least about one MP_KARATSUBA_MUL_CUTOFF bigger * to make some sense, but it depends on architecture, OS, position of the * stars... so YMMV. - * Using it to cut the input into slices small enough for s_mp_mul_digs_fast + * Using it to cut the input into slices small enough for fast_s_mp_mul_digs * was actually slower on the author's machine, but YMMV. */ (min_len >= MP_KARATSUBA_MUL_CUTOFF) && @@ -37,10 +37,10 @@ mp_err mp_mul(const mp_int *a, const mp_int *b, mp_int *c) /* can we use the fast multiplier? * * The fast multiplier can be used if the output will - * have less than PRIVATE_MP_WARRAY digits and the number of + * have less than MP_WARRAY digits and the number of * digits won't affect carry propagation */ - (digs < PRIVATE_MP_WARRAY) && + (digs < MP_WARRAY) && (min_len <= MP_MAXFAST)) { err = s_mp_mul_digs_fast(a, b, c, digs); } else if (MP_HAS(S_MP_MUL_DIGS)) { diff --git a/libtommath/bn_mp_prime_rand.c b/libtommath/bn_mp_prime_rand.c index af19d76c..4530e9a 100644 --- a/libtommath/bn_mp_prime_rand.c +++ b/libtommath/bn_mp_prime_rand.c @@ -18,7 +18,7 @@ */ /* This is possibly the mother of all prime generation functions, muahahahahaha! */ -mp_err s_mp_prime_random_ex(mp_int *a, int t, int size, int flags, mp_prime_callback cb, void *dat) +mp_err s_mp_prime_random_ex(mp_int *a, int t, int size, int flags, private_mp_prime_callback cb, void *dat) { unsigned char *tmp, maskAND, maskOR_msb, maskOR_lsb; int bsize, maskOR_msb_offset; diff --git a/libtommath/bn_mp_radix_smap.c b/libtommath/bn_mp_radix_smap.c index 5147c74..a16128d 100644 --- a/libtommath/bn_mp_radix_smap.c +++ b/libtommath/bn_mp_radix_smap.c @@ -4,8 +4,8 @@ /* SPDX-License-Identifier: Unlicense */ /* chars used in radix conversions */ -const char s_mp_rmap[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/"; -const unsigned char s_mp_rmap_reverse[] = { +const char *const mp_s_rmap = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/"; +const uint8_t mp_s_rmap_reverse[] = { 0xff, 0xff, 0xff, 0x3e, 0xff, 0xff, 0xff, 0x3f, /* ()*+,-./ */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* 01234567 */ 0x08, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 89:;<=>? */ @@ -18,4 +18,5 @@ const unsigned char s_mp_rmap_reverse[] = { 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, /* pqrstuvw */ 0x3b, 0x3c, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, /* xyz{|}~. */ }; +const size_t mp_s_rmap_reverse_sz = sizeof(mp_s_rmap_reverse); #endif diff --git a/libtommath/bn_mp_read_radix.c b/libtommath/bn_mp_read_radix.c index 456a387..de18e06 100644 --- a/libtommath/bn_mp_read_radix.c +++ b/libtommath/bn_mp_read_radix.c @@ -43,10 +43,10 @@ mp_err mp_read_radix(mp_int *a, const char *str, int radix) */ ch = (radix <= 36) ? (char)MP_TOUPPER((int)*str) : *str; pos = (unsigned)(ch - '('); - if (MP_RMAP_REVERSE_SIZE < pos) { + if (mp_s_rmap_reverse_sz < pos) { break; } - y = (int)s_mp_rmap_reverse[pos]; + y = (int)mp_s_rmap_reverse[pos]; /* if the char was found in the map * and is less than the given radix add it diff --git a/libtommath/bn_mp_root_u32.c b/libtommath/bn_mp_root_u32.c index b60cf26..ba65549 100644 --- a/libtommath/bn_mp_root_u32.c +++ b/libtommath/bn_mp_root_u32.c @@ -12,7 +12,7 @@ * which will find the root in log(N) time where * each step involves a fair bit. */ -mp_err mp_root_u32(const mp_int *a, unsigned int b, mp_int *c) +mp_err mp_root_u32(const mp_int *a, uint32_t b, mp_int *c) { mp_int t1, t2, t3, a_; mp_ord cmp; @@ -40,7 +40,7 @@ mp_err mp_root_u32(const mp_int *a, unsigned int b, mp_int *c) log_2(n) because the bit-length of the "n" is measured with an int and hence the root is always < 2 (two). */ - if (b > (unsigned int)(INT_MAX/2)) { + if (b > (uint32_t)(INT_MAX/2)) { mp_set(c, 1uL); c->sign = a->sign; err = MP_OKAY; diff --git a/libtommath/bn_mp_set_double.c b/libtommath/bn_mp_set_double.c index a42fc70..7f1ab75 100644 --- a/libtommath/bn_mp_set_double.c +++ b/libtommath/bn_mp_set_double.c @@ -16,7 +16,7 @@ mp_err mp_set_double(mp_int *a, double b) cast.dbl = b; exp = (int)((unsigned)(cast.bits >> 52) & 0x7FFu); - frac = (cast.bits & ((1uLL << 52) - 1uLL)) | (1uLL << 52); + frac = (cast.bits & (((uint64_t)1 << 52) - (uint64_t)1)) | ((uint64_t)1 << 52); if (exp == 0x7FF) { /* +-inf, NaN */ return MP_VAL; @@ -30,7 +30,7 @@ mp_err mp_set_double(mp_int *a, double b) return err; } - if (((cast.bits >> 63) != 0uLL) && !MP_IS_ZERO(a)) { + if (((cast.bits >> 63) != 0u) && !MP_IS_ZERO(a)) { a->sign = MP_NEG; } diff --git a/libtommath/bn_mp_sqr.c b/libtommath/bn_mp_sqr.c index 571b25d..e0d0a73 100644 --- a/libtommath/bn_mp_sqr.c +++ b/libtommath/bn_mp_sqr.c @@ -14,7 +14,7 @@ mp_err mp_sqr(const mp_int *a, mp_int *b) (a->used >= MP_KARATSUBA_SQR_CUTOFF)) { err = s_mp_karatsuba_sqr(a, b); } else if (MP_HAS(S_MP_SQR_FAST) && /* can we use the fast comba multiplier? */ - (((a->used * 2) + 1) < PRIVATE_MP_WARRAY) && + (((a->used * 2) + 1) < MP_WARRAY) && (a->used < (MP_MAXFAST / 2))) { err = s_mp_sqr_fast(a, b); } else if (MP_HAS(S_MP_SQR)) { diff --git a/libtommath/bn_mp_to_radix.c b/libtommath/bn_mp_to_radix.c index 18cb504..7fa86ca 100644 --- a/libtommath/bn_mp_to_radix.c +++ b/libtommath/bn_mp_to_radix.c @@ -60,7 +60,7 @@ mp_err mp_to_radix(const mp_int *a, char *str, size_t maxlen, size_t *written, i if ((err = mp_div_d(&t, (mp_digit)radix, &t, &d)) != MP_OKAY) { goto LBL_ERR; } - *str++ = s_mp_rmap[d]; + *str++ = mp_s_rmap[d]; ++digs; } /* reverse the digits of the string. In this case _s points diff --git a/libtommath/bn_mp_to_ubin.c b/libtommath/bn_mp_to_ubin.c index 4913c3a..1681ca7 100644 --- a/libtommath/bn_mp_to_ubin.c +++ b/libtommath/bn_mp_to_ubin.c @@ -10,8 +10,7 @@ mp_err mp_to_ubin(const mp_int *a, unsigned char *buf, size_t maxlen, size_t *wr mp_err err; mp_int t; - size_t size = (size_t)mp_count_bits(a); - count = (size / 8u) + (((size & 7u) != 0u) ? 1u : 0u); + count = mp_ubin_size(a); if (count > maxlen) { return MP_BUF; } diff --git a/libtommath/bn_prime_tab.c b/libtommath/bn_prime_tab.c index 6bd53fe..a6c07f8 100644 --- a/libtommath/bn_prime_tab.c +++ b/libtommath/bn_prime_tab.c @@ -3,7 +3,7 @@ /* LibTomMath, multiple-precision integer library -- Tom St Denis */ /* SPDX-License-Identifier: Unlicense */ -const mp_digit s_mp_prime_tab[] = { +const mp_digit ltm_prime_tab[] = { 0x0002, 0x0003, 0x0005, 0x0007, 0x000B, 0x000D, 0x0011, 0x0013, 0x0017, 0x001D, 0x001F, 0x0025, 0x0029, 0x002B, 0x002F, 0x0035, 0x003B, 0x003D, 0x0043, 0x0047, 0x0049, 0x004F, 0x0053, 0x0059, @@ -44,4 +44,18 @@ const mp_digit s_mp_prime_tab[] = { #endif }; +#if defined(__GNUC__) && __GNUC__ >= 4 +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +const mp_digit *s_mp_prime_tab = ltm_prime_tab; +#pragma GCC diagnostic pop +#elif defined(_MSC_VER) && _MSC_VER >= 1500 +#pragma warning(push) +#pragma warning(disable: 4996) +const mp_digit *s_mp_prime_tab = ltm_prime_tab; +#pragma warning(pop) +#else +const mp_digit *s_mp_prime_tab = ltm_prime_tab; +#endif + #endif diff --git a/libtommath/bn_s_mp_exptmod_fast.c b/libtommath/bn_s_mp_exptmod_fast.c index 3a0dc5b..682ded8 100644 --- a/libtommath/bn_s_mp_exptmod_fast.c +++ b/libtommath/bn_s_mp_exptmod_fast.c @@ -81,7 +81,7 @@ mp_err s_mp_exptmod_fast(const mp_int *G, const mp_int *X, const mp_int *P, mp_i /* automatically pick the comba one if available (saves quite a few calls/ifs) */ if (MP_HAS(S_MP_MONTGOMERY_REDUCE_FAST) && - (((P->used * 2) + 1) < PRIVATE_MP_WARRAY) && + (((P->used * 2) + 1) < MP_WARRAY) && (P->used < MP_MAXFAST)) { redux = s_mp_montgomery_reduce_fast; } else if (MP_HAS(MP_MONTGOMERY_REDUCE)) { diff --git a/libtommath/bn_s_mp_montgomery_reduce_fast.c b/libtommath/bn_s_mp_montgomery_reduce_fast.c index 8c3fe5e..3f0c672 100644 --- a/libtommath/bn_s_mp_montgomery_reduce_fast.c +++ b/libtommath/bn_s_mp_montgomery_reduce_fast.c @@ -15,9 +15,9 @@ mp_err s_mp_montgomery_reduce_fast(mp_int *x, const mp_int *n, mp_digit rho) { int ix, olduse; mp_err err; - mp_word W[PRIVATE_MP_WARRAY]; + mp_word W[MP_WARRAY]; - if (x->used > PRIVATE_MP_WARRAY) { + if (x->used > MP_WARRAY) { return MP_VAL; } diff --git a/libtommath/bn_s_mp_mul_digs.c b/libtommath/bn_s_mp_mul_digs.c index 6c1114e..64509d4 100644 --- a/libtommath/bn_s_mp_mul_digs.c +++ b/libtommath/bn_s_mp_mul_digs.c @@ -17,7 +17,7 @@ mp_err s_mp_mul_digs(const mp_int *a, const mp_int *b, mp_int *c, int digs) mp_digit tmpx, *tmpt, *tmpy; /* can we use the fast multiplier? */ - if ((digs < PRIVATE_MP_WARRAY) && + if ((digs < MP_WARRAY) && (MP_MIN(a->used, b->used) < MP_MAXFAST)) { return s_mp_mul_digs_fast(a, b, c, digs); } diff --git a/libtommath/bn_s_mp_mul_digs_fast.c b/libtommath/bn_s_mp_mul_digs_fast.c index 090a099..b2a287b 100644 --- a/libtommath/bn_s_mp_mul_digs_fast.c +++ b/libtommath/bn_s_mp_mul_digs_fast.c @@ -23,7 +23,7 @@ mp_err s_mp_mul_digs_fast(const mp_int *a, const mp_int *b, mp_int *c, int digs) { int olduse, pa, ix, iz; mp_err err; - mp_digit W[PRIVATE_MP_WARRAY]; + mp_digit W[MP_WARRAY]; mp_word _W; /* grow the destination as required */ diff --git a/libtommath/bn_s_mp_mul_high_digs.c b/libtommath/bn_s_mp_mul_high_digs.c index 5c5d721..2bb2a50 100644 --- a/libtommath/bn_s_mp_mul_high_digs.c +++ b/libtommath/bn_s_mp_mul_high_digs.c @@ -17,7 +17,7 @@ mp_err s_mp_mul_high_digs(const mp_int *a, const mp_int *b, mp_int *c, int digs) /* can we use the fast multiplier? */ if (MP_HAS(S_MP_MUL_HIGH_DIGS_FAST) - && ((a->used + b->used + 1) < PRIVATE_MP_WARRAY) + && ((a->used + b->used + 1) < MP_WARRAY) && (MP_MIN(a->used, b->used) < MP_MAXFAST)) { return s_mp_mul_high_digs_fast(a, b, c, digs); } diff --git a/libtommath/bn_s_mp_mul_high_digs_fast.c b/libtommath/bn_s_mp_mul_high_digs_fast.c index a74adc6..a0513b4 100644 --- a/libtommath/bn_s_mp_mul_high_digs_fast.c +++ b/libtommath/bn_s_mp_mul_high_digs_fast.c @@ -3,8 +3,8 @@ /* LibTomMath, multiple-precision integer library -- Tom St Denis */ /* SPDX-License-Identifier: Unlicense */ -/* this is a modified version of fast_s_mul_digs that only produces - * output digits *above* digs. See the comments for fast_s_mul_digs +/* this is a modified version of s_mp_mul_digs_fast that only produces + * output digits *above* digs. See the comments for s_mp_mul_digs_fast * to see how it works. * * This is used in the Barrett reduction since for one of the multiplications @@ -16,7 +16,7 @@ mp_err s_mp_mul_high_digs_fast(const mp_int *a, const mp_int *b, mp_int *c, int { int olduse, pa, ix, iz; mp_err err; - mp_digit W[PRIVATE_MP_WARRAY]; + mp_digit W[MP_WARRAY]; mp_word _W; /* grow the destination as required */ diff --git a/libtommath/bn_s_mp_rand_jenkins.c b/libtommath/bn_s_mp_rand_jenkins.c index da0771c..c64afac 100644 --- a/libtommath/bn_s_mp_rand_jenkins.c +++ b/libtommath/bn_s_mp_rand_jenkins.c @@ -27,10 +27,10 @@ static uint64_t s_rand_jenkins_val(void) void s_mp_rand_jenkins_init(uint64_t seed) { - uint64_t i; + int i; jenkins_x.a = 0xf1ea5eedULL; jenkins_x.b = jenkins_x.c = jenkins_x.d = seed; - for (i = 0uLL; i < 20uLL; ++i) { + for (i = 0; i < 20; ++i) { (void)s_rand_jenkins_val(); } } diff --git a/libtommath/bn_s_mp_sqr_fast.c b/libtommath/bn_s_mp_sqr_fast.c index d5090fe..4a8a891 100644 --- a/libtommath/bn_s_mp_sqr_fast.c +++ b/libtommath/bn_s_mp_sqr_fast.c @@ -16,7 +16,7 @@ After that loop you do the squares and add them in. mp_err s_mp_sqr_fast(const mp_int *a, mp_int *b) { int olduse, pa, ix, iz; - mp_digit W[PRIVATE_MP_WARRAY], *tmpx; + mp_digit W[MP_WARRAY], *tmpx; mp_word W1; mp_err err; diff --git a/libtommath/changes.txt b/libtommath/changes.txt index ebf7382..1b3a7a3 100644 --- a/libtommath/changes.txt +++ b/libtommath/changes.txt @@ -1,4 +1,4 @@ -XXX XXth, 2019 +Oct 22nd, 2019 v1.2.0 -- A huge refactoring of the library happened - renaming, deprecating and replacing existing functions by improved API's. diff --git a/libtommath/helper.pl b/libtommath/helper.pl index e60c1a7..c624b7c 100755 --- a/libtommath/helper.pl +++ b/libtommath/helper.pl @@ -51,7 +51,7 @@ sub check_source { push @{$troubles->{tab}}, $lineno if $l =~ /\t/ && basename($file) !~ /^makefile/i; push @{$troubles->{non_ascii_char}}, $lineno if $l =~ /[^[:ascii:]]/; push @{$troubles->{cpp_comment}}, $lineno if $file =~ /\.(c|h)$/ && ($l =~ /\s\/\// || $l =~ /\/\/\s/); - # we prefer using XMALLOC, XFREE, XREALLOC, XCALLOC ... + # we prefer using MP_MALLOC, MP_FREE, MP_REALLOC, MP_CALLOC ... push @{$troubles->{unwanted_malloc}}, $lineno if $file =~ /^[^\/]+\.c$/ && $l =~ /\bmalloc\s*\(/; push @{$troubles->{unwanted_realloc}}, $lineno if $file =~ /^[^\/]+\.c$/ && $l =~ /\brealloc\s*\(/; push @{$troubles->{unwanted_calloc}}, $lineno if $file =~ /^[^\/]+\.c$/ && $l =~ /\bcalloc\s*\(/; diff --git a/libtommath/makefile_include.mk b/libtommath/makefile_include.mk index 7b025e8..452d37d 100644 --- a/libtommath/makefile_include.mk +++ b/libtommath/makefile_include.mk @@ -116,10 +116,10 @@ endif # adjust coverage set ifneq ($(filter $(_ARCH), i386 i686 x86_64 amd64 ia64),) - COVERAGE = test_standalone timing + COVERAGE = test timing COVERAGE_APP = ./test && ./timing else - COVERAGE = test_standalone + COVERAGE = test COVERAGE_APP = ./test endif @@ -135,6 +135,10 @@ LIBPATH ?= $(PREFIX)/lib INCPATH ?= $(PREFIX)/include DATAPATH ?= $(PREFIX)/share/doc/libtommath/pdf +# build & run test-suite +check: test + ./test + #make the code coverage of the library # coverage: LTM_CFLAGS += -fprofile-arcs -ftest-coverage -DTIMING_NO_LOGS diff --git a/libtommath/tommath.h b/libtommath/tommath.h index 285fc8a..8f2867e 100644 --- a/libtommath/tommath.h +++ b/libtommath/tommath.h @@ -4,7 +4,8 @@ #ifndef BN_H_ #define BN_H_ -#ifndef MP_NO_STDINT +#if !defined(MP_NO_STDINT) && !defined(_STDINT_H) && !defined(_STDINT_H_) \ + && !defined(__CLANG_STDINT_H) && !defined(_STDINT) # include <stdint.h> #endif #include <stddef.h> @@ -61,23 +62,30 @@ extern "C" { /* some default configurations. * * A "mp_digit" must be able to hold MP_DIGIT_BIT + 1 bits + * A "mp_word" must be able to hold 2*MP_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 -typedef unsigned char mp_digit; +typedef uint8_t mp_digit; +typedef uint16_t private_mp_word; # define MP_DIGIT_BIT 7 #elif defined(MP_16BIT) -typedef unsigned short mp_digit; +typedef uint16_t mp_digit; +typedef uint32_t private_mp_word; # define MP_DIGIT_BIT 15 #elif defined(MP_64BIT) /* for GCC only on supported platforms */ -typedef unsigned long long mp_digit; +typedef uint64_t mp_digit; +#if defined(__GNUC__) +typedef unsigned long private_mp_word __attribute__((mode(TI))); +#endif # define MP_DIGIT_BIT 60 #else -typedef unsigned int mp_digit; +typedef uint32_t mp_digit; +typedef uint64_t private_mp_word; # ifdef MP_31BIT /* * This is an extension that uses 31-bit digits. @@ -93,6 +101,11 @@ typedef unsigned int mp_digit; # endif #endif +/* mp_word is a private type */ +#define mp_word MP_DEPRECATED_PRAGMA("mp_word has been made private") private_mp_word + +#define MP_SIZEOF_MP_DIGIT (MP_DEPRECATED_PRAGMA("MP_SIZEOF_MP_DIGIT has been deprecated, use sizeof (mp_digit)") sizeof (mp_digit)) + #define MP_MASK ((((mp_digit)1)<<((mp_digit)MP_DIGIT_BIT))-((mp_digit)1)) #define MP_DIGIT_MAX MP_MASK @@ -101,6 +114,10 @@ typedef unsigned int mp_digit; #define MP_PRIME_SAFE 0x0002 /* Safe prime (p-1)/2 == prime */ #define MP_PRIME_2MSB_ON 0x0008 /* force 2nd MSB to 1 */ +#define LTM_PRIME_BBS (MP_DEPRECATED_PRAGMA("LTM_PRIME_BBS has been deprecated, use MP_PRIME_BBS") MP_PRIME_BBS) +#define LTM_PRIME_SAFE (MP_DEPRECATED_PRAGMA("LTM_PRIME_SAFE has been deprecated, use MP_PRIME_SAFE") MP_PRIME_SAFE) +#define LTM_PRIME_2MSB_ON (MP_DEPRECATED_PRAGMA("LTM_PRIME_2MSB_ON has been deprecated, use MP_PRIME_2MSB_ON") MP_PRIME_2MSB_ON) + #ifdef MP_USE_ENUMS typedef enum { MP_ZPOS = 0, /* positive */ @@ -185,6 +202,10 @@ TOOM_SQR_CUTOFF; # define MP_PREC (MP_DEPRECATED_PRAGMA("MP_PREC is an internal macro") PRIVATE_MP_PREC) #endif +/* size of comba arrays, should be at least 2 * 2**(BITS_PER_WORD - BITS_PER_DIGIT*2) */ +#define PRIVATE_MP_WARRAY (int)(1 << (((CHAR_BIT * (int)sizeof(private_mp_word)) - (2 * MP_DIGIT_BIT)) + 1)) +#define MP_WARRAY (MP_DEPRECATED_PRAGMA("MP_WARRAY is an internal macro") PRIVATE_MP_WARRAY) + #if defined(__GNUC__) && __GNUC__ >= 4 # define MP_NULL_TERMINATED __attribute__((sentinel)) #else @@ -216,13 +237,22 @@ TOOM_SQR_CUTOFF; #if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 405) # define MP_DEPRECATED(x) __attribute__((deprecated("replaced by " #x))) +#elif defined(_MSC_VER) && _MSC_VER >= 1500 +# define MP_DEPRECATED(x) __declspec(deprecated("replaced by " #x)) +#else +# define MP_DEPRECATED(x) +#endif + +#ifndef MP_NO_DEPRECATED_PRAGMA +#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 301) # define PRIVATE_MP_DEPRECATED_PRAGMA(s) _Pragma(#s) # define MP_DEPRECATED_PRAGMA(s) PRIVATE_MP_DEPRECATED_PRAGMA(GCC warning s) #elif defined(_MSC_VER) && _MSC_VER >= 1500 -# define MP_DEPRECATED(x) __declspec(deprecated("replaced by " #x)) # define MP_DEPRECATED_PRAGMA(s) __pragma(message(s)) -#else -# define MP_DEPRECATED(s) +#endif +#endif + +#ifndef MP_DEPRECATED_PRAGMA # define MP_DEPRECATED_PRAGMA(s) #endif @@ -232,11 +262,19 @@ TOOM_SQR_CUTOFF; #define SIGN(m) (MP_DEPRECATED_PRAGMA("SIGN macro is deprecated, use z->sign instead") (m)->sign) /* the infamous mp_int structure */ -typedef struct { +#ifndef MP_INT_DECLARED +#define MP_INT_DECLARED +typedef struct mp_int mp_int; +#endif +struct mp_int { int used, alloc; mp_sign sign; mp_digit *dp; -} mp_int; +}; + +/* callback for mp_prime_random, should fill dst with random bytes and return how many read [upto len] */ +typedef int private_mp_prime_callback(unsigned char *dst, int len, void *dat); +typedef private_mp_prime_callback MP_DEPRECATED(mp_rand_source) ltm_prime_callback; /* error code to char* string */ const char *mp_error_to_string(mp_err code) MP_WUR; @@ -280,7 +318,6 @@ double mp_get_double(const mp_int *a) MP_WUR; mp_err mp_set_double(mp_int *a, double b) MP_WUR; /* get integer, set integer and init with integer (int32_t) */ -#ifndef MP_NO_STDINT int32_t mp_get_i32(const mp_int *a) MP_WUR; void mp_set_i32(mp_int *a, int32_t b); mp_err mp_init_i32(mp_int *a, int32_t b) MP_WUR; @@ -303,9 +340,12 @@ mp_err mp_init_u64(mp_int *a, uint64_t b) MP_WUR; /* get magnitude */ uint32_t mp_get_mag_u32(const mp_int *a) MP_WUR; uint64_t mp_get_mag_u64(const mp_int *a) MP_WUR; -#endif unsigned long mp_get_mag_ul(const mp_int *a) MP_WUR; -Tcl_WideUInt mp_get_mag_ull(const mp_int *a) MP_WUR; +#ifdef _MSC_VER +#define mp_get_mag_ull(a) ((unsigned __int64)mp_get_mag_u64(a)) +#else +unsigned long long mp_get_mag_ull(const mp_int *a) MP_WUR; +#endif /* get integer, set integer (long) */ long mp_get_l(const mp_int *a) MP_WUR; @@ -317,15 +357,27 @@ mp_err mp_init_l(mp_int *a, long b) MP_WUR; void mp_set_ul(mp_int *a, unsigned long b); mp_err mp_init_ul(mp_int *a, unsigned long b) MP_WUR; -/* get integer, set integer (Tcl_WideInt) */ -Tcl_WideInt mp_get_ll(const mp_int *a) MP_WUR; -void mp_set_ll(mp_int *a, Tcl_WideInt b); -mp_err mp_init_ll(mp_int *a, Tcl_WideInt b) MP_WUR; +#ifdef _MSC_VER +/* get integer, set integer (long long) */ +#define mp_get_ll(a) ((__int64)mp_get_i64(a)) +#define mp_set_ll(a,b) mp_set_i64(a,b) +#define mp_init_ll(a,b) mp_init_i64(a,b) -/* get integer, set integer (Tcl_WideUInt) */ -#define mp_get_ull(a) ((Tcl_WideUInt)mp_get_ll(a)) -void mp_set_ull(mp_int *a, Tcl_WideUInt b); -mp_err mp_init_ull(mp_int *a, Tcl_WideUInt b) MP_WUR; +/* get integer, set integer (unsigned long long) */ +#define mp_get_ull(a) ((unsigned __int64)mp_get_i64(a)) +#define mp_set_ull(a,b) mp_set_u64(a,b) +#define mp_init_ull(a,b) mp_init_u64(a,b) +#else +/* get integer, set integer (long long) */ +long long mp_get_ll(const mp_int *a) MP_WUR; +void mp_set_ll(mp_int *a, long long b); +mp_err mp_init_ll(mp_int *a, long long b) MP_WUR; + +/* get integer, set integer (unsigned long long) */ +#define mp_get_ull(a) ((unsigned long long)mp_get_ll(a)) +void mp_set_ull(mp_int *a, unsigned long long b); +mp_err mp_init_ull(mp_int *a, unsigned long long b) MP_WUR; +#endif /* set to single unsigned digit, up to MP_DIGIT_MAX */ void mp_set(mp_int *a, mp_digit b); @@ -334,10 +386,14 @@ mp_err mp_init_set(mp_int *a, mp_digit b) MP_WUR; /* get integer, set integer and init with integer (deprecated) */ MP_DEPRECATED(mp_get_mag_u32/mp_get_u32) unsigned long mp_get_int(const mp_int *a) MP_WUR; MP_DEPRECATED(mp_get_mag_ul/mp_get_ul) unsigned long mp_get_long(const mp_int *a) MP_WUR; -MP_DEPRECATED(mp_get_mag_ull/mp_get_ull) Tcl_WideUInt mp_get_long_long(const mp_int *a) MP_WUR; +#ifdef _MSC_VER +MP_DEPRECATED(mp_get_mag_ull/mp_get_ull) unsigned __int64 mp_get_long_long(const mp_int *a) MP_WUR; +#endif MP_DEPRECATED(mp_set_ul) mp_err mp_set_int(mp_int *a, unsigned long b); MP_DEPRECATED(mp_set_ul) mp_err mp_set_long(mp_int *a, unsigned long b); -MP_DEPRECATED(mp_set_ull) mp_err mp_set_long_long(mp_int *a, Tcl_WideUInt b); +#ifdef _MSC_VER +MP_DEPRECATED(mp_set_ull) mp_err mp_set_long_long(mp_int *a, unsigned __int64 b); +#endif MP_DEPRECATED(mp_init_ul) mp_err mp_init_set_int(mp_int *a, unsigned long b) MP_WUR; /* copy, b = a */ @@ -534,7 +590,7 @@ mp_err mp_lcm(const mp_int *a, const mp_int *b, mp_int *c) MP_WUR; * * returns error if a < 0 and b is even */ -mp_err mp_root_u32(const mp_int *a, unsigned int b, mp_int *c) MP_WUR; +mp_err mp_root_u32(const mp_int *a, uint32_t b, mp_int *c) MP_WUR; MP_DEPRECATED(mp_root_u32) mp_err mp_n_root(const mp_int *a, mp_digit b, mp_int *c) MP_WUR; MP_DEPRECATED(mp_root_u32) mp_err mp_n_root_ex(const mp_int *a, mp_digit b, mp_int *c, int fast) MP_WUR; @@ -614,6 +670,12 @@ mp_err mp_exptmod(const mp_int *G, const mp_int *X, const mp_int *P, mp_int *Y) #endif #define PRIME_SIZE (MP_DEPRECATED_PRAGMA("PRIME_SIZE has been made internal") PRIVATE_MP_PRIME_TAB_SIZE) +/* table of first PRIME_SIZE primes */ +MP_DEPRECATED(internal) extern const mp_digit ltm_prime_tab[PRIVATE_MP_PRIME_TAB_SIZE]; + +/* result=1 if a is divisible by one of the first PRIME_SIZE primes */ +MP_DEPRECATED(mp_prime_is_prime) mp_err mp_prime_is_divisible(const mp_int *a, mp_bool *result) MP_WUR; + /* performs one Fermat test of "a" using base "b". * Sets result to 0 if composite or 1 if probable prime */ @@ -662,6 +724,17 @@ mp_err mp_prime_is_prime(const mp_int *a, int t, mp_bool *result) MP_WUR; */ mp_err mp_prime_next_prime(mp_int *a, int t, int bbs_style) MP_WUR; +/* 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_DEPRECATED_PRAGMA("mp_prime_random has been deprecated, use mp_prime_rand instead") mp_prime_random_ex(a, t, ((size) * 8) + 1, (bbs==1)?MP_PRIME_BBS:0, cb, dat)) + /* makes a truly random prime of a given size (bits), * * Flags are as follows: @@ -675,13 +748,15 @@ mp_err mp_prime_next_prime(mp_int *a, int t, int bbs_style) MP_WUR; * so it can be NULL * */ +MP_DEPRECATED(mp_prime_rand) mp_err mp_prime_random_ex(mp_int *a, int t, int size, int flags, + private_mp_prime_callback cb, void *dat) MP_WUR; mp_err mp_prime_rand(mp_int *a, int t, int size, int flags) MP_WUR; /* Integer logarithm to integer base */ -mp_err mp_log_u32(const mp_int *a, unsigned int base, unsigned int *c) MP_WUR; +mp_err mp_log_u32(const mp_int *a, uint32_t base, uint32_t *c) MP_WUR; /* c = a**b */ -mp_err mp_expt_u32(const mp_int *a, unsigned int b, mp_int *c) MP_WUR; +mp_err mp_expt_u32(const mp_int *a, uint32_t b, mp_int *c) MP_WUR; MP_DEPRECATED(mp_expt_u32) mp_err mp_expt_d(const mp_int *a, mp_digit b, mp_int *c) MP_WUR; MP_DEPRECATED(mp_expt_u32) mp_err mp_expt_d_ex(const mp_int *a, mp_digit b, mp_int *c, int fast) MP_WUR; diff --git a/libtommath/tommath_private.h b/libtommath/tommath_private.h index 2e3250c..5123f53 100644 --- a/libtommath/tommath_private.h +++ b/libtommath/tommath_private.h @@ -1,12 +1,18 @@ /* LibTomMath, multiple-precision integer library -- Tom St Denis */ /* SPDX-License-Identifier: Unlicense */ -#ifndef TOMMATH_PRIVATE_H_ -#define TOMMATH_PRIVATE_H_ +#ifndef TOMMATH_PRIV_H_ +#define TOMMATH_PRIV_H_ -#include <tommath.h> +#ifdef MP_NO_STDINT +#ifdef HAVE_STDINT_H +# include <stdint.h> +#else +# include "../compat/stdint.h" +#endif +#endif +#include "tclTomMath.h" #include "tommath_class.h" -#include <limits.h> /* * Private symbols @@ -118,6 +124,11 @@ do { \ # define MP_KARATSUBA_SQR_CUTOFF MP_DEFAULT_KARATSUBA_SQR_CUTOFF # define MP_TOOM_MUL_CUTOFF MP_DEFAULT_TOOM_MUL_CUTOFF # define MP_TOOM_SQR_CUTOFF MP_DEFAULT_TOOM_SQR_CUTOFF +#else +# define MP_KARATSUBA_MUL_CUTOFF KARATSUBA_MUL_CUTOFF +# define MP_KARATSUBA_SQR_CUTOFF KARATSUBA_SQR_CUTOFF +# define MP_TOOM_MUL_CUTOFF TOOM_MUL_CUTOFF +# define MP_TOOM_SQR_CUTOFF TOOM_SQR_CUTOFF #endif /* define heap macros */ @@ -145,6 +156,12 @@ extern void MP_FREE(void *mem, size_t size); #define MP__STRINGIZE(x) ""#x"" #define MP_HAS(x) (sizeof(MP_STRINGIZE(BN_##x##_C)) == 1u) +/* TODO: Remove private_mp_word as soon as deprecated mp_word is removed from tommath. */ +#if !defined(MP_64BIT) || defined(__GNUC__) +#undef mp_word +typedef private_mp_word mp_word; +#endif + #define MP_MIN(x, y) (((x) < (y)) ? (x) : (y)) #define MP_MAX(x, y) (((x) > (y)) ? (x) : (y)) @@ -159,31 +176,18 @@ extern void MP_FREE(void *mem, size_t size); #define MP_SIZEOF_BITS(type) ((size_t)CHAR_BIT * sizeof(type)) #define MP_MAXFAST (int)(1uL << (MP_SIZEOF_BITS(mp_word) - (2u * (size_t)MP_DIGIT_BIT))) -#define PRIVATE_MP_WARRAY (1 << ((MP_SIZEOF_BITS(mp_word) - (2 * MP_DIGIT_BIT)) + 1)) - -#if defined(MP_16BIT) -typedef unsigned int mp_word; -#elif defined(MP_64BIT) && defined(__GNUC__) -typedef unsigned long mp_word __attribute__((mode(TI))); -#elif defined(_WIN32) -typedef unsigned __int64 mp_word; -#else -typedef unsigned long long mp_word; -#endif +/* TODO: Remove PRIVATE_MP_WARRAY as soon as deprecated MP_WARRAY is removed from tommath.h */ +#undef MP_WARRAY +#define MP_WARRAY PRIVATE_MP_WARRAY -MP_STATIC_ASSERT(correct_word_size, sizeof(mp_word) == 2 * sizeof(mp_digit)) - -/* default precision */ -#ifndef MP_PREC -# ifndef MP_LOW_MEM -# define MP_PREC 32 /* default digits of precision */ -# else -# define MP_PREC 8 /* default digits of precision */ -# endif +/* TODO: Remove PRIVATE_MP_PREC as soon as deprecated MP_PREC is removed from tommath.h */ +#ifdef PRIVATE_MP_PREC +# undef MP_PREC +# define MP_PREC PRIVATE_MP_PREC #endif /* Minimum number of available digits in mp_int, MP_PREC >= MP_MIN_PREC */ -#define MP_MIN_PREC ((((int)MP_SIZEOF_BITS(Tcl_WideInt) + MP_DIGIT_BIT) - 1) / MP_DIGIT_BIT) +#define MP_MIN_PREC ((((int)MP_SIZEOF_BITS(uintmax_t) + MP_DIGIT_BIT) - 1) / MP_DIGIT_BIT) MP_STATIC_ASSERT(prec_geq_min_prec, MP_PREC >= MP_MIN_PREC) @@ -211,21 +215,44 @@ MP_PRIVATE mp_err s_mp_montgomery_reduce_fast(mp_int *x, const mp_int *n, mp_dig MP_PRIVATE mp_err s_mp_exptmod_fast(const mp_int *G, const mp_int *X, const mp_int *P, mp_int *Y, int redmode) MP_WUR; MP_PRIVATE mp_err s_mp_exptmod(const mp_int *G, const mp_int *X, const mp_int *P, mp_int *Y, int redmode) MP_WUR; MP_PRIVATE mp_err s_mp_rand_platform(void *p, size_t n) MP_WUR; -typedef int mp_prime_callback(unsigned char *dst, int len, void *dat); -MP_PRIVATE mp_err s_mp_prime_random_ex(mp_int *a, int t, int size, int flags, mp_prime_callback cb, void *dat); +MP_PRIVATE mp_err s_mp_prime_random_ex(mp_int *a, int t, int size, int flags, private_mp_prime_callback cb, void *dat); MP_PRIVATE void s_mp_reverse(unsigned char *s, size_t len); MP_PRIVATE mp_err s_mp_prime_is_divisible(const mp_int *a, mp_bool *result); /* TODO: jenkins prng is not thread safe as of now */ MP_PRIVATE mp_err s_mp_rand_jenkins(void *p, size_t n) MP_WUR; -#ifndef MP_NO_STDINT MP_PRIVATE void s_mp_rand_jenkins_init(uint64_t seed); -#endif -#define MP_RMAP_REVERSE_SIZE 88 -extern MP_PRIVATE const char s_mp_rmap[]; -extern MP_PRIVATE const unsigned char s_mp_rmap_reverse[]; -extern MP_PRIVATE const mp_digit s_mp_prime_tab[]; +extern MP_PRIVATE const char *const mp_s_rmap; +extern MP_PRIVATE const uint8_t mp_s_rmap_reverse[]; +extern MP_PRIVATE const size_t mp_s_rmap_reverse_sz; +extern MP_PRIVATE const mp_digit *s_mp_prime_tab; + +/* deprecated functions */ +MP_DEPRECATED(s_mp_invmod_fast) mp_err fast_mp_invmod(const mp_int *a, const mp_int *b, mp_int *c); +MP_DEPRECATED(s_mp_montgomery_reduce_fast) mp_err fast_mp_montgomery_reduce(mp_int *x, const mp_int *n, + mp_digit rho); +MP_DEPRECATED(s_mp_mul_digs_fast) mp_err fast_s_mp_mul_digs(const mp_int *a, const mp_int *b, mp_int *c, + int digs); +MP_DEPRECATED(s_mp_mul_high_digs_fast) mp_err fast_s_mp_mul_high_digs(const mp_int *a, const mp_int *b, + mp_int *c, + int digs); +MP_DEPRECATED(s_mp_sqr_fast) mp_err fast_s_mp_sqr(const mp_int *a, mp_int *b); +MP_DEPRECATED(s_mp_balance_mul) mp_err mp_balance_mul(const mp_int *a, const mp_int *b, mp_int *c); +MP_DEPRECATED(s_mp_exptmod_fast) mp_err mp_exptmod_fast(const mp_int *G, const mp_int *X, const mp_int *P, + mp_int *Y, + int redmode); +MP_DEPRECATED(s_mp_invmod_slow) mp_err mp_invmod_slow(const mp_int *a, const mp_int *b, mp_int *c); +MP_DEPRECATED(s_mp_karatsuba_mul) mp_err mp_karatsuba_mul(const mp_int *a, const mp_int *b, mp_int *c); +MP_DEPRECATED(s_mp_karatsuba_sqr) mp_err mp_karatsuba_sqr(const mp_int *a, mp_int *b); +MP_DEPRECATED(s_mp_toom_mul) mp_err mp_toom_mul(const mp_int *a, const mp_int *b, mp_int *c); +MP_DEPRECATED(s_mp_toom_sqr) mp_err mp_toom_sqr(const mp_int *a, mp_int *b); +MP_DEPRECATED(s_mp_reverse) void bn_reverse(unsigned char *s, int len); + +#ifndef TCL_WITH_EXTERNAL_TOMMATH +#undef mp_sqr +#define mp_sqr TclBN_mp_sqr +#endif #define MP_GET_ENDIANNESS(x) \ do{\ diff --git a/libtommath/win32/libtommath.dll b/libtommath/win32/libtommath.dll Binary files differnew file mode 100755 index 0000000..aa0a8cb --- /dev/null +++ b/libtommath/win32/libtommath.dll diff --git a/libtommath/win32/tommath.lib b/libtommath/win32/tommath.lib Binary files differnew file mode 100644 index 0000000..dd3e82e --- /dev/null +++ b/libtommath/win32/tommath.lib diff --git a/libtommath/win64/libtommath.dll b/libtommath/win64/libtommath.dll Binary files differnew file mode 100755 index 0000000..2225faf --- /dev/null +++ b/libtommath/win64/libtommath.dll diff --git a/libtommath/win64/libtommath.dll.a b/libtommath/win64/libtommath.dll.a Binary files differnew file mode 100644 index 0000000..40adaf7 --- /dev/null +++ b/libtommath/win64/libtommath.dll.a diff --git a/libtommath/win64/tommath.lib b/libtommath/win64/tommath.lib Binary files differnew file mode 100755 index 0000000..434fa7c --- /dev/null +++ b/libtommath/win64/tommath.lib diff --git a/macosx/Tcl.xcode/project.pbxproj b/macosx/Tcl.xcode/project.pbxproj index 96ba347..c472803 100644 --- a/macosx/Tcl.xcode/project.pbxproj +++ b/macosx/Tcl.xcode/project.pbxproj @@ -140,7 +140,6 @@ F96D494708F272C3004A47F5 /* bn_mp_toom_sqr.c in Sources */ = {isa = PBXBuildFile; fileRef = F96D42C908F272B3004A47F5 /* bn_mp_toom_sqr.c */; }; F96D494908F272C3004A47F5 /* bn_mp_to_radix.c in Sources */ = {isa = PBXBuildFile; fileRef = F96D42CB08F272B3004A47F5 /* bn_mp_to_radix.c */; }; F96D494C08F272C3004A47F5 /* bn_mp_zero.c in Sources */ = {isa = PBXBuildFile; fileRef = F96D42CE08F272B3004A47F5 /* bn_mp_zero.c */; }; - F96D494E08F272C3004A47F5 /* bn_reverse.c in Sources */ = {isa = PBXBuildFile; fileRef = F96D42D008F272B3004A47F5 /* bn_reverse.c */; }; F96D494F08F272C3004A47F5 /* bn_s_mp_add.c in Sources */ = {isa = PBXBuildFile; fileRef = F96D42D108F272B3004A47F5 /* bn_s_mp_add.c */; }; F96D495108F272C3004A47F5 /* bn_s_mp_mul_digs.c in Sources */ = {isa = PBXBuildFile; fileRef = F96D42D308F272B3004A47F5 /* bn_s_mp_mul_digs.c */; }; F96D495308F272C3004A47F5 /* bn_s_mp_sqr.c in Sources */ = {isa = PBXBuildFile; fileRef = F96D42D508F272B3004A47F5 /* bn_s_mp_sqr.c */; }; @@ -535,7 +534,6 @@ F96D3F3408F272A7004A47F5 /* tclUtf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tclUtf.c; sourceTree = "<group>"; }; F96D3F3508F272A7004A47F5 /* tclUtil.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tclUtil.c; sourceTree = "<group>"; }; F96D3F3608F272A7004A47F5 /* tclVar.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tclVar.c; sourceTree = "<group>"; }; - F96D3F3708F272A7004A47F5 /* tommath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tommath.h; sourceTree = "<group>"; }; F96D3F3908F272A8004A47F5 /* auto.tcl */ = {isa = PBXFileReference; explicitFileType = text.script; fileEncoding = 4; path = auto.tcl; sourceTree = "<group>"; }; F96D3F3A08F272A8004A47F5 /* clock.tcl */ = {isa = PBXFileReference; explicitFileType = text.script; fileEncoding = 4; path = clock.tcl; sourceTree = "<group>"; }; F96D3F3C08F272A8004A47F5 /* pkgIndex.tcl */ = {isa = PBXFileReference; explicitFileType = text.script; fileEncoding = 4; path = pkgIndex.tcl; sourceTree = "<group>"; }; @@ -612,7 +610,6 @@ F96D42CC08F272B3004A47F5 /* bn_mp_ubin_size.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bn_mp_ubin_size.c; sourceTree = "<group>"; }; F96D42CD08F272B3004A47F5 /* bn_mp_xor.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bn_mp_xor.c; sourceTree = "<group>"; }; F96D42CE08F272B3004A47F5 /* bn_mp_zero.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bn_mp_zero.c; sourceTree = "<group>"; }; - F96D42D008F272B3004A47F5 /* bn_reverse.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bn_reverse.c; sourceTree = "<group>"; }; F96D42D108F272B3004A47F5 /* bn_s_mp_add.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bn_s_mp_add.c; sourceTree = "<group>"; }; F96D42D308F272B3004A47F5 /* bn_s_mp_mul_digs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bn_s_mp_mul_digs.c; sourceTree = "<group>"; }; F96D42D508F272B3004A47F5 /* bn_s_mp_sqr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bn_s_mp_sqr.c; sourceTree = "<group>"; }; @@ -767,7 +764,6 @@ F96D43D108F272B8004A47F5 /* checkLibraryDoc.tcl */ = {isa = PBXFileReference; explicitFileType = text.script; fileEncoding = 4; path = checkLibraryDoc.tcl; sourceTree = "<group>"; }; F96D43D208F272B8004A47F5 /* configure */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = configure; sourceTree = "<group>"; }; F96D43D308F272B8004A47F5 /* configure.ac */ = {isa = PBXFileReference; explicitFileType = text.script.sh; fileEncoding = 4; path = configure.ac; sourceTree = "<group>"; }; - F96D442408F272B8004A47F5 /* fix_tommath_h.tcl */ = {isa = PBXFileReference; explicitFileType = text.script; fileEncoding = 4; path = fix_tommath_h.tcl; sourceTree = "<group>"; }; F96D442508F272B8004A47F5 /* genStubs.tcl */ = {isa = PBXFileReference; explicitFileType = text.script; fileEncoding = 4; path = genStubs.tcl; sourceTree = "<group>"; }; F96D442708F272B8004A47F5 /* index.tcl */ = {isa = PBXFileReference; explicitFileType = text.script; fileEncoding = 4; path = index.tcl; sourceTree = "<group>"; }; F96D442808F272B8004A47F5 /* installData.tcl */ = {isa = PBXFileReference; explicitFileType = text.script; fileEncoding = 4; path = installData.tcl; sourceTree = "<group>"; }; @@ -1323,7 +1319,6 @@ F96D3F3508F272A7004A47F5 /* tclUtil.c */, F96D3F3608F272A7004A47F5 /* tclVar.c */, F96437C90EF0D4B2003F468E /* tclZlib.c */, - F96D3F3708F272A7004A47F5 /* tommath.h */, ); path = generic; sourceTree = "<group>"; @@ -1462,7 +1457,6 @@ F96D42CC08F272B3004A47F5 /* bn_mp_ubin_size.c */, F96D42CD08F272B3004A47F5 /* bn_mp_xor.c */, F96D42CE08F272B3004A47F5 /* bn_mp_zero.c */, - F96D42D008F272B3004A47F5 /* bn_reverse.c */, F96D42D108F272B3004A47F5 /* bn_s_mp_add.c */, F96D42D308F272B3004A47F5 /* bn_s_mp_mul_digs.c */, F96D42D508F272B3004A47F5 /* bn_s_mp_sqr.c */, @@ -1651,7 +1645,6 @@ F96D43D108F272B8004A47F5 /* checkLibraryDoc.tcl */, F96D43D208F272B8004A47F5 /* configure */, F96D43D308F272B8004A47F5 /* configure.ac */, - F96D442408F272B8004A47F5 /* fix_tommath_h.tcl */, F96D442508F272B8004A47F5 /* genStubs.tcl */, F96D442708F272B8004A47F5 /* index.tcl */, F96D442808F272B8004A47F5 /* installData.tcl */, @@ -2092,7 +2085,6 @@ F9E61D32090A48FA002B3151 /* bn_mp_ubin_size.c in Sources */, F9E61D2D090A48BB002B3151 /* bn_mp_xor.c in Sources */, F96D494C08F272C3004A47F5 /* bn_mp_zero.c in Sources */, - F96D494E08F272C3004A47F5 /* bn_reverse.c in Sources */, F96D494F08F272C3004A47F5 /* bn_s_mp_add.c in Sources */, F96D495108F272C3004A47F5 /* bn_s_mp_mul_digs.c in Sources */, F96D495308F272C3004A47F5 /* bn_s_mp_sqr.c in Sources */, diff --git a/macosx/Tcl.xcodeproj/project.pbxproj b/macosx/Tcl.xcodeproj/project.pbxproj index 267ae61..75fe76e 100644 --- a/macosx/Tcl.xcodeproj/project.pbxproj +++ b/macosx/Tcl.xcodeproj/project.pbxproj @@ -140,7 +140,6 @@ F96D494708F272C3004A47F5 /* bn_mp_toom_sqr.c in Sources */ = {isa = PBXBuildFile; fileRef = F96D42C908F272B3004A47F5 /* bn_mp_toom_sqr.c */; }; F96D494908F272C3004A47F5 /* bn_mp_to_radix.c in Sources */ = {isa = PBXBuildFile; fileRef = F96D42CB08F272B3004A47F5 /* bn_mp_to_radix.c */; }; F96D494C08F272C3004A47F5 /* bn_mp_zero.c in Sources */ = {isa = PBXBuildFile; fileRef = F96D42CE08F272B3004A47F5 /* bn_mp_zero.c */; }; - F96D494E08F272C3004A47F5 /* bn_reverse.c in Sources */ = {isa = PBXBuildFile; fileRef = F96D42D008F272B3004A47F5 /* bn_reverse.c */; }; F96D494F08F272C3004A47F5 /* bn_s_mp_add.c in Sources */ = {isa = PBXBuildFile; fileRef = F96D42D108F272B3004A47F5 /* bn_s_mp_add.c */; }; F96D495108F272C3004A47F5 /* bn_s_mp_mul_digs.c in Sources */ = {isa = PBXBuildFile; fileRef = F96D42D308F272B3004A47F5 /* bn_s_mp_mul_digs.c */; }; F96D495308F272C3004A47F5 /* bn_s_mp_sqr.c in Sources */ = {isa = PBXBuildFile; fileRef = F96D42D508F272B3004A47F5 /* bn_s_mp_sqr.c */; }; @@ -534,7 +533,6 @@ F96D3F3408F272A7004A47F5 /* tclUtf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tclUtf.c; sourceTree = "<group>"; }; F96D3F3508F272A7004A47F5 /* tclUtil.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tclUtil.c; sourceTree = "<group>"; }; F96D3F3608F272A7004A47F5 /* tclVar.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tclVar.c; sourceTree = "<group>"; }; - F96D3F3708F272A7004A47F5 /* tommath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tommath.h; sourceTree = "<group>"; }; F96D3F3908F272A8004A47F5 /* auto.tcl */ = {isa = PBXFileReference; explicitFileType = text.script; fileEncoding = 4; path = auto.tcl; sourceTree = "<group>"; }; F96D3F3A08F272A8004A47F5 /* clock.tcl */ = {isa = PBXFileReference; explicitFileType = text.script; fileEncoding = 4; path = clock.tcl; sourceTree = "<group>"; }; F96D3F3C08F272A8004A47F5 /* pkgIndex.tcl */ = {isa = PBXFileReference; explicitFileType = text.script; fileEncoding = 4; path = pkgIndex.tcl; sourceTree = "<group>"; }; @@ -612,7 +610,6 @@ F96D42CC08F272B3004A47F5 /* bn_mp_ubin_size.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bn_mp_ubin_size.c; sourceTree = "<group>"; }; F96D42CD08F272B3004A47F5 /* bn_mp_xor.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bn_mp_xor.c; sourceTree = "<group>"; }; F96D42CE08F272B3004A47F5 /* bn_mp_zero.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bn_mp_zero.c; sourceTree = "<group>"; }; - F96D42D008F272B3004A47F5 /* bn_reverse.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bn_reverse.c; sourceTree = "<group>"; }; F96D42D108F272B3004A47F5 /* bn_s_mp_add.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bn_s_mp_add.c; sourceTree = "<group>"; }; F96D42D308F272B3004A47F5 /* bn_s_mp_mul_digs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bn_s_mp_mul_digs.c; sourceTree = "<group>"; }; F96D42D508F272B3004A47F5 /* bn_s_mp_sqr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bn_s_mp_sqr.c; sourceTree = "<group>"; }; @@ -767,7 +764,6 @@ F96D43D108F272B8004A47F5 /* checkLibraryDoc.tcl */ = {isa = PBXFileReference; explicitFileType = text.script; fileEncoding = 4; path = checkLibraryDoc.tcl; sourceTree = "<group>"; }; F96D43D208F272B8004A47F5 /* configure */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = configure; sourceTree = "<group>"; }; F96D43D308F272B8004A47F5 /* configure.ac */ = {isa = PBXFileReference; explicitFileType = text.script.sh; fileEncoding = 4; path = configure.ac; sourceTree = "<group>"; }; - F96D442408F272B8004A47F5 /* fix_tommath_h.tcl */ = {isa = PBXFileReference; explicitFileType = text.script; fileEncoding = 4; path = fix_tommath_h.tcl; sourceTree = "<group>"; }; F96D442508F272B8004A47F5 /* genStubs.tcl */ = {isa = PBXFileReference; explicitFileType = text.script; fileEncoding = 4; path = genStubs.tcl; sourceTree = "<group>"; }; F96D442708F272B8004A47F5 /* index.tcl */ = {isa = PBXFileReference; explicitFileType = text.script; fileEncoding = 4; path = index.tcl; sourceTree = "<group>"; }; F96D442808F272B8004A47F5 /* installData.tcl */ = {isa = PBXFileReference; explicitFileType = text.script; fileEncoding = 4; path = installData.tcl; sourceTree = "<group>"; }; @@ -1323,7 +1319,6 @@ F96D3F3508F272A7004A47F5 /* tclUtil.c */, F96D3F3608F272A7004A47F5 /* tclVar.c */, F96437C90EF0D4B2003F468E /* tclZlib.c */, - F96D3F3708F272A7004A47F5 /* tommath.h */, ); path = generic; sourceTree = "<group>"; @@ -1462,7 +1457,6 @@ F96D42CC08F272B3004A47F5 /* bn_mp_ubin_size.c */, F96D42CD08F272B3004A47F5 /* bn_mp_xor.c */, F96D42CE08F272B3004A47F5 /* bn_mp_zero.c */, - F96D42D008F272B3004A47F5 /* bn_reverse.c */, F96D42D108F272B3004A47F5 /* bn_s_mp_add.c */, F96D42D308F272B3004A47F5 /* bn_s_mp_mul_digs.c */, F96D42D508F272B3004A47F5 /* bn_s_mp_sqr.c */, @@ -1651,7 +1645,6 @@ F96D43D108F272B8004A47F5 /* checkLibraryDoc.tcl */, F96D43D208F272B8004A47F5 /* configure */, F96D43D308F272B8004A47F5 /* configure.ac */, - F96D442408F272B8004A47F5 /* fix_tommath_h.tcl */, F96D442508F272B8004A47F5 /* genStubs.tcl */, F96D442708F272B8004A47F5 /* index.tcl */, F96D442808F272B8004A47F5 /* installData.tcl */, @@ -2092,7 +2085,6 @@ F9E61D32090A48FA002B3151 /* bn_mp_ubin_size.c in Sources */, F9E61D2D090A48BB002B3151 /* bn_mp_xor.c in Sources */, F96D494C08F272C3004A47F5 /* bn_mp_zero.c in Sources */, - F96D494E08F272C3004A47F5 /* bn_reverse.c in Sources */, F96D494F08F272C3004A47F5 /* bn_s_mp_add.c in Sources */, F96D495108F272C3004A47F5 /* bn_s_mp_mul_digs.c in Sources */, F96D495308F272C3004A47F5 /* bn_s_mp_sqr.c in Sources */, diff --git a/tests/clock.test b/tests/clock.test index 8d73bf2..55607ce 100644 --- a/tests/clock.test +++ b/tests/clock.test @@ -250,17 +250,6 @@ proc ::testClock::registry { cmd path key } { return [dict get $reg $path $key] } -proc timeWithinDuration {duration start end} { - regexp {([\d.]+)(s|ms|us)} $duration -> duration unit - if {[llength $start] > 1} { set start [expr "([join $start +])/[llength $start]"] } - if {[llength $end] > 1} { set end [expr "([join $end +])/[llength $end]"] } - set delta [expr {$end - $start}] - expr { - ($delta > 0) && ($delta <= $duration) ? - "ok" : - "test should have taken 0-$duration $unit, actually took $delta"} -} - # Test some of the basics of [clock format] @@ -35451,22 +35440,36 @@ test clock-33.4a {clock milliseconds} { concat {} } {} test clock-33.5 {clock clicks tests, millisecond timing test} { - set start [set end {}] - lassign [time { - lappend start [clock clicks -milli] - after 1 {lappend end [clock clicks -milli]} - vwait end - } 5] tm - timeWithinDuration [expr {int($tm/1000 + 1)}]ms $start $end + # This test can fail on a system that is so heavily loaded that + # the test takes >60 ms to run. + if {[lindex [timerate { + set start [clock clicks -milli] + timerate {} 10; # short but precise busy wait + set end [clock clicks -milli] + } 1 1] 0] > 60000} { + ::tcltest::Skip "timing issue" + } + # 60 msecs seems to be the max time slice under Windows 95/98 + expr { + ($end > $start) && (($end - $start) <= 60) ? + "ok" : + "test should have taken 0-60 ms, actually took [expr $end - $start]"} } {ok} test clock-33.5a {clock tests, millisecond timing test} { - set start [set end {}] - lassign [time { - lappend start [clock milliseconds] - after 1 {lappend end [clock milliseconds]} - vwait end - } 5] tm - timeWithinDuration [expr {int($tm/1000 + 1)}]ms $start $end + # This test can fail on a system that is so heavily loaded that + # the test takes >60 ms to run. + if {[lindex [timerate { + set start [clock milliseconds] + timerate {} 10; # short but precise busy wait + set end [clock milliseconds] + } 1 1] 0] > 60000} { + ::tcltest::Skip "timing issue" + } + # 60 msecs seems to be the max time slice under Windows 95/98 + expr { + ($end > $start) && (($end - $start) <= 60) ? + "ok" : + "test should have taken 0-60 ms, actually took [expr $end - $start]"} } {ok} test clock-33.6 {clock clicks, milli with too much abbreviation} { list [catch { clock clicks ? } msg] $msg @@ -35476,23 +35479,29 @@ test clock-33.7 {clock clicks, milli with too much abbreviation} { } {1 {ambiguous option "-": must be -milliseconds or -microseconds}} test clock-33.8 {clock clicks test, microsecond timing test} { - set start [set end {}] - lassign [time { - lappend start [clock clicks -micro] - after 1 {lappend end [clock clicks -micro]} - vwait end - } 5] tm - timeWithinDuration [expr {int($tm + 10)}]us $start $end -} {ok} + # This test can fail on a system that is so heavily loaded that + # the test takes >60 ms to run. + if {[lindex [timerate { + set start [clock clicks -micro] + timerate {} 10; # short but precise busy wait + set end [clock clicks -micro] + } 1 1] 0] > 60000} { + ::tcltest::Skip "timing issue" + } + expr {($end > $start) && (($end - $start) <= 60000)} +} {1} test clock-33.8a {clock test, microsecond timing test} { - set start [set end {}] - lassign [time { - lappend start [clock microseconds] - after 1 {lappend end [clock microseconds]} - vwait end - } 5] tm - timeWithinDuration [expr {int($tm + 10)}]us $start $end -} {ok} + # This test can fail on a system that is so heavily loaded that + # the test takes >60 ms to run. + if {[lindex [timerate { + set start [clock microseconds] + timerate {} 10; # short but precise busy wait + set end [clock microseconds] + } 1 1] 0] > 60000} { + ::tcltest::Skip "timing issue" + } + expr {($end > $start) && (($end - $start) <= 60000)} +} {1} test clock-33.9 {clock clicks test, millis align with seconds} { set t1 [clock seconds] diff --git a/tests/encoding.test b/tests/encoding.test index 8a8f8c3..be504fb 100644 --- a/tests/encoding.test +++ b/tests/encoding.test @@ -321,11 +321,11 @@ test encoding-15.3 {UtfToUtfProc null character input} teststringbytes { binary scan [teststringbytes $y] H* z set z } c080 -test encoding-15.4 {UtfToUtfProc emoji character input} { +test encoding-15.4 {UtfToUtfProc emoji character input} -body { set x \xED\xA0\xBD\xED\xB8\x82 set y [encoding convertfrom utf-8 \xED\xA0\xBD\xED\xB8\x82] list [string length $x] $y -} "6 \U1F602" +} -result "6 \U1F602" test encoding-15.5 {UtfToUtfProc emoji character input} { set x \xF0\x9F\x98\x82 set y [encoding convertfrom utf-8 \xF0\x9F\x98\x82] @@ -335,8 +335,8 @@ test encoding-15.6 {UtfToUtfProc emoji character output} { set x \uDE02\uD83D\uDE02\uD83D set y [encoding convertto utf-8 \uDE02\uD83D\uDE02\uD83D] binary scan $y H* z - list [string length $x] [string length $y] $z -} {4 10 edb882f09f9882eda0bd} + list [string length $y] $z +} {10 edb882f09f9882eda0bd} test encoding-15.7 {UtfToUtfProc emoji character output} { set x \uDE02\uD83D\uD83D set y [encoding convertto utf-8 \uDE02\uD83D\uD83D] @@ -355,7 +355,43 @@ test encoding-15.9 {UtfToUtfProc emoji character output} { binary scan $y H* z list [string length $x] [string length $y] $z } {3 7 edb882eda0bd58} -test encoding-15.10 {UtfToUtfProc emoji character output} { +test encoding-15.10 {UtfToUtfProc high surrogate character output} { + set x \uDE02\xE9 + set y [encoding convertto utf-8 \uDE02\xE9] + binary scan $y H* z + list [string length $x] [string length $y] $z +} {2 5 edb882c3a9} +test encoding-15.11 {UtfToUtfProc low surrogate character output} { + set x \uDA02\xE9 + set y [encoding convertto utf-8 \uDA02\xE9] + binary scan $y H* z + list [string length $x] [string length $y] $z +} {2 5 eda882c3a9} +test encoding-15.12 {UtfToUtfProc high surrogate character output} { + set x \uDE02Y + set y [encoding convertto utf-8 \uDE02Y] + binary scan $y H* z + list [string length $x] [string length $y] $z +} {2 4 edb88259} +test encoding-15.13 {UtfToUtfProc low surrogate character output} { + set x \uDA02Y + set y [encoding convertto utf-8 \uDA02Y] + binary scan $y H* z + list [string length $x] [string length $y] $z +} {2 4 eda88259} +test encoding-15.14 {UtfToUtfProc high surrogate character output} { + set x \uDE02 + set y [encoding convertto utf-8 \uDE02] + binary scan $y H* z + list [string length $x] [string length $y] $z +} {1 3 edb882} +test encoding-15.15 {UtfToUtfProc low surrogate character output} { + set x \uDA02 + set y [encoding convertto utf-8 \uDA02] + binary scan $y H* z + list [string length $x] [string length $y] $z +} {1 3 eda882} +test encoding-15.16 {UtfToUtfProc emoji character output} { set x \U1F602 set y [encoding convertto utf-8 \U1F602] binary scan $y H* z @@ -365,26 +401,36 @@ test encoding-15.10 {UtfToUtfProc emoji character output} { test encoding-16.1 {Utf16ToUtfProc} -body { set val [encoding convertfrom utf-16 NN] list $val [format %x [scan $val %c]] -} -result "\u4e4e 4e4e" +} -result "\u4E4E 4e4e" test encoding-16.2 {Utf16ToUtfProc} -body { - set val [encoding convertfrom utf-16 "\xd8\xd8\xdc\xdc"] + set val [encoding convertfrom utf-16 "\xD8\xD8\xDC\xDC"] list $val [format %x [scan $val %c]] -} -result "\U460dc 460dc" -test encoding-16.3 {Ucs2ToUtfProc} -body { +} -result "\U460DC 460dc" +test encoding-16.3 {Utf16ToUtfProc} -body { + set val [encoding convertfrom utf-16 "\xDC\xDC"] + list $val [format %x [scan $val %c]] +} -result "\uDCDC dcdc" +test encoding-16.4 {Ucs2ToUtfProc} -body { set val [encoding convertfrom ucs-2 NN] list $val [format %x [scan $val %c]] -} -result "\u4e4e 4e4e" +} -result "\u4E4E 4e4e" test encoding-16.4 {Ucs2ToUtfProc} -body { - set val [encoding convertfrom ucs-2 "\xd8\xd8\xdc\xdc"] + set val [encoding convertfrom ucs-2 "\xD8\xD8\xDC\xDC"] list $val [format %x [scan $val %c]] -} -result "\U460dc 460dc" +} -result "\U460DC 460dc" test encoding-17.1 {UtfToUtf16Proc} -body { - encoding convertto utf-16 "\U460dc" -} -result "\xd8\xd8\xdc\xdc" -test encoding-17.2 {UtfToUcs2Proc} -body { - encoding convertfrom utf-16 [encoding convertto ucs-2 "\U460dc"] -} -result "\ufffd" + encoding convertto utf-16 "\U460DC" +} -result "\xD8\xD8\xDC\xDC" +test encoding-17.2 {UtfToUtf16Proc} -body { + encoding convertto utf-16 "\uDCDC" +} -result "\xDC\xDC" +test encoding-17.3 {UtfToUtf16Proc} -body { + encoding convertto utf-16 "\uD8D8" +} -result "\xD8\xD8" +test encoding-17.4 {UtfToUcs2Proc} -body { + encoding convertfrom utf-16 [encoding convertto ucs-2 "\U460DC"] +} -result "\uFFFD" test encoding-18.1 {TableToUtfProc} { } {} @@ -671,6 +717,23 @@ test encoding-27.2 {encoding dirs basic behavior} -returnCodes error -body { } -result "expected directory list but got \"\{not a list\"" } + + +test encoding-28.0 {all encodings load} -body { + set string hello + foreach name [encoding names] { + if {$name ne "unicode"} { + incr count + } + encoding convertto $name $string + + # discard the cached internal representation of Tcl_Encoding + # Unfortunately, without this, encoding 2-1 fails. + llength $name + } + return $count +} -result 85 + runtests } diff --git a/tests/expr.test b/tests/expr.test index 49ca63e..dad8677 100644 --- a/tests/expr.test +++ b/tests/expr.test @@ -6821,6 +6821,72 @@ test expr-41.2 {exponent underflow} { expr 1.0e-2147483630 } 0.0 +test expr-41.3 {exponent overflow} { + expr 1e2147483647 +} Inf +test expr-41.4 {exponent overflow} { + expr 1e2147483648 +} Inf +test expr-41.5 {exponent overflow} { + expr 100e2147483645 +} Inf +test expr-41.6 {exponent overflow} { + expr 100e2147483646 +} Inf +test expr-41.7 {exponent overflow} { + expr 1.0e2147483647 +} Inf +test expr-41.8 {exponent overflow} { + expr 1.0e2147483648 +} Inf +test expr-41.9 {exponent overflow} { + expr 1.2e2147483647 +} Inf +test expr-41.10 {exponent overflow} { + expr 1.2e2147483648 +} Inf + +test expr-41.11 {exponent overflow} { + expr 1e-2147483648 +} 0.0 +test expr-41.12 {exponent overflow} { + expr 1e-2147483649 +} 0.0 +test expr-41.13 {exponent overflow} { + expr 100e-2147483650 +} 0.0 +test expr-41.14 {exponent overflow} { + expr 100e-2147483651 +} 0.0 +test expr-41.15 {exponent overflow} { + expr 1.0e-2147483648 +} 0.0 +test expr-41.16 {exponent overflow} { + expr 1.0e-2147483649 +} 0.0 +test expr-41.17 {exponent overflow} { + expr 1.23e-2147483646 +} 0.0 +test expr-41.18 {exponent overflow} { + expr 1.23e-2147483647 +} 0.0 + +test expr-41.19 {numSigDigs == 0} { + expr 0e309 +} 0.0 +test expr-41.20 {numSigDigs == 0} { + expr 0e310 +} 0.0 +test expr-41.21 {negative zero, large exponent} { + expr -0e309 +} -0.0 +test expr-41.22 {negative zero, large exponent} { + expr -0e310 +} -0.0 +test expr-41.23 {floating point overflow on significand (Bug 1de6b0629e)} { + expr 123[string repeat 0 309]1e-310 +} 123.0 + test expr-42.1 {denormals} ieeeFloatingPoint { expr 7e-324 } 5e-324 diff --git a/tests/httpcookie.test b/tests/httpcookie.test index a6b193f..b3c5412 100644 --- a/tests/httpcookie.test +++ b/tests/httpcookie.test @@ -25,48 +25,48 @@ testConstraint cookiejar [expr {[testConstraint sqlite3] && ![catch { package require cookiejar }]}] -set COOKIEJAR_VERSION 0.1 -test http-cookiejar-1.1 "cookie storage: packaging" {notOSXtravis sqlite3 cookiejar} { +set COOKIEJAR_VERSION 0.2.0 +test http-cookiejar-1.1 "cookie storage: packaging" {cookiejar} { package require cookiejar } $COOKIEJAR_VERSION -test http-cookiejar-1.2 "cookie storage: packaging" {notOSXtravis sqlite3 cookiejar} { +test http-cookiejar-1.2 "cookie storage: packaging" {cookiejar} { package require cookiejar package require cookiejar } $COOKIEJAR_VERSION test http-cookiejar-2.1 "cookie storage: basics" -constraints { - notOSXtravis sqlite3 cookiejar + cookiejar } -returnCodes error -body { http::cookiejar } -result {wrong # args: should be "http::cookiejar method ?arg ...?"} test http-cookiejar-2.2 "cookie storage: basics" -constraints { - notOSXtravis sqlite3 cookiejar + cookiejar } -returnCodes error -body { http::cookiejar ? } -result {unknown method "?": must be configure, create, destroy or new} test http-cookiejar-2.3 "cookie storage: basics" -constraints { - notOSXtravis sqlite3 cookiejar + cookiejar } -body { http::cookiejar configure } -result {-domainfile -domainlist -domainrefresh -loglevel -offline -purgeold -retain -vacuumtrigger} test http-cookiejar-2.4 "cookie storage: basics" -constraints { - notOSXtravis sqlite3 cookiejar + cookiejar } -returnCodes error -body { http::cookiejar configure a b c d e } -result {wrong # args: should be "http::cookiejar configure ?optionName? ?optionValue?"} test http-cookiejar-2.5 "cookie storage: basics" -constraints { - notOSXtravis sqlite3 cookiejar + cookiejar } -returnCodes error -body { http::cookiejar configure a } -result {bad option "a": must be -domainfile, -domainlist, -domainrefresh, -loglevel, -offline, -purgeold, -retain, or -vacuumtrigger} test http-cookiejar-2.6 "cookie storage: basics" -constraints { - notOSXtravis sqlite3 cookiejar + cookiejar } -returnCodes error -body { http::cookiejar configure -d } -result {ambiguous option "-d": must be -domainfile, -domainlist, -domainrefresh, -loglevel, -offline, -purgeold, -retain, or -vacuumtrigger} test http-cookiejar-2.7 "cookie storage: basics" -setup { set old [http::cookiejar configure -loglevel] -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { list [http::cookiejar configure -loglevel] \ [http::cookiejar configure -loglevel debug] \ [http::cookiejar configure -loglevel] \ @@ -77,7 +77,7 @@ test http-cookiejar-2.7 "cookie storage: basics" -setup { } -result {info debug debug error error} test http-cookiejar-2.8 "cookie storage: basics" -setup { set old [http::cookiejar configure -loglevel] -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { list [http::cookiejar configure -loglevel] \ [http::cookiejar configure -loglevel d] \ [http::cookiejar configure -loglevel i] \ @@ -88,38 +88,38 @@ test http-cookiejar-2.8 "cookie storage: basics" -setup { } -result {info debug info warn error} test http-cookiejar-2.9 "cookie storage: basics" -body { http::cookiejar configure -off -} -constraints {notOSXtravis sqlite3 cookiejar} -match glob -result * +} -constraints {cookiejar} -match glob -result * test http-cookiejar-2.10 "cookie storage: basics" -setup { set oldval [http::cookiejar configure -offline] -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { http::cookiejar configure -offline true } -cleanup { catch {http::cookiejar configure -offline $oldval} } -result 1 test http-cookiejar-2.11 "cookie storage: basics" -setup { set oldval [http::cookiejar configure -offline] -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { http::cookiejar configure -offline nonbool } -cleanup { catch {http::cookiejar configure -offline $oldval} } -returnCodes error -result {expected boolean value but got "nonbool"} test http-cookiejar-2.12 "cookie storage: basics" -setup { set oldval [http::cookiejar configure -purgeold] -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { http::cookiejar configure -purge nonint } -cleanup { catch {http::cookiejar configure -purgeold $oldval} } -returnCodes error -result {expected positive integer but got "nonint"} test http-cookiejar-2.13 "cookie storage: basics" -setup { set oldval [http::cookiejar configure -domainrefresh] -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { http::cookiejar configure -domainref nonint } -cleanup { catch {http::cookiejar configure -domainrefresh $oldval} } -returnCodes error -result {expected positive integer but got "nonint"} test http-cookiejar-2.14 "cookie storage: basics" -setup { set oldval [http::cookiejar configure -domainrefresh] -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { http::cookiejar configure -domainref -42 } -cleanup { catch {http::cookiejar configure -domainrefresh $oldval} @@ -128,7 +128,7 @@ test http-cookiejar-2.15 "cookie storage: basics" -setup { set oldval [http::cookiejar configure -domainrefresh] set result unset set tracer [http::cookiejar create tracer] -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { oo::objdefine $tracer method PostponeRefresh {} { set ::result set next @@ -140,28 +140,28 @@ test http-cookiejar-2.15 "cookie storage: basics" -setup { catch {http::cookiejar configure -domainrefresh $oldval} } -result set -test http-cookiejar-3.1 "cookie storage: class" {notOSXtravis sqlite3 cookiejar} { +test http-cookiejar-3.1 "cookie storage: class" {cookiejar} { info object isa object http::cookiejar } 1 -test http-cookiejar-3.2 "cookie storage: class" {notOSXtravis sqlite3 cookiejar} { +test http-cookiejar-3.2 "cookie storage: class" {cookiejar} { info object isa class http::cookiejar } 1 -test http-cookiejar-3.3 "cookie storage: class" {notOSXtravis sqlite3 cookiejar} { +test http-cookiejar-3.3 "cookie storage: class" {cookiejar} { lsort [info object methods http::cookiejar] } {configure} -test http-cookiejar-3.4 "cookie storage: class" {notOSXtravis sqlite3 cookiejar} { +test http-cookiejar-3.4 "cookie storage: class" {cookiejar} { lsort [info object methods http::cookiejar -all] } {configure create destroy new} test http-cookiejar-3.5 "cookie storage: class" -setup { catch {rename ::cookiejar ""} -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { namespace eval :: {http::cookiejar create cookiejar} } -cleanup { catch {rename ::cookiejar ""} } -result ::cookiejar test http-cookiejar-3.6 "cookie storage: class" -setup { catch {rename ::cookiejar ""} -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { list [http::cookiejar create ::cookiejar] [info commands ::cookiejar] \ [::cookiejar destroy] [info commands ::cookiejar] } -cleanup { @@ -169,7 +169,7 @@ test http-cookiejar-3.6 "cookie storage: class" -setup { } -result {::cookiejar ::cookiejar {} {}} test http-cookiejar-3.7 "cookie storage: class" -setup { catch {rename ::cookiejar ""} -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { http::cookiejar create ::cookiejar foo bar } -returnCodes error -cleanup { catch {rename ::cookiejar ""} @@ -178,7 +178,7 @@ test http-cookiejar-3.8 "cookie storage: class" -setup { catch {rename ::cookiejar ""} set f [makeFile "" cookiejar] file delete $f -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { list [file exists $f] [http::cookiejar create ::cookiejar $f] \ [file exists $f] } -cleanup { @@ -188,7 +188,7 @@ test http-cookiejar-3.8 "cookie storage: class" -setup { test http-cookiejar-3.9 "cookie storage: class" -setup { catch {rename ::cookiejar ""} set f [makeFile "bogus content for a database" cookiejar] -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { http::cookiejar create ::cookiejar $f } -returnCodes error -cleanup { catch {rename ::cookiejar ""} @@ -197,7 +197,7 @@ test http-cookiejar-3.9 "cookie storage: class" -setup { test http-cookiejar-3.10 "cookie storage: class" -setup { catch {rename ::cookiejar ""} set dir [makeDirectory cookiejar] -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { http::cookiejar create ::cookiejar $dir } -returnCodes error -cleanup { catch {rename ::cookiejar ""} @@ -206,49 +206,49 @@ test http-cookiejar-3.10 "cookie storage: class" -setup { test http-cookiejar-4.1 "cookie storage: instance" -setup { http::cookiejar create ::cookiejar -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { cookiejar } -returnCodes error -cleanup { ::cookiejar destroy } -result {wrong # args: should be "cookiejar method ?arg ...?"} test http-cookiejar-4.2 "cookie storage: instance" -setup { http::cookiejar create ::cookiejar -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { cookiejar ? } -returnCodes error -cleanup { ::cookiejar destroy } -result {unknown method "?": must be destroy, forceLoadDomainData, getCookies, lookup, policyAllow or storeCookie} test http-cookiejar-4.3 "cookie storage: instance" -setup { http::cookiejar create ::cookiejar -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { lsort [info object methods cookiejar -all] } -cleanup { ::cookiejar destroy } -result {destroy forceLoadDomainData getCookies lookup policyAllow storeCookie} test http-cookiejar-4.4 "cookie storage: instance" -setup { http::cookiejar create ::cookiejar -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { cookiejar getCookies } -returnCodes error -cleanup { ::cookiejar destroy } -result {wrong # args: should be "cookiejar getCookies proto host path"} test http-cookiejar-4.5 "cookie storage" -setup { http::cookiejar create ::cookiejar -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { cookiejar getCookies http www.example.com / } -cleanup { ::cookiejar destroy } -result {} test http-cookiejar-4.6 "cookie storage: instance" -setup { http::cookiejar create ::cookiejar -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { cookiejar storeCookie } -returnCodes error -cleanup { ::cookiejar destroy } -result {wrong # args: should be "cookiejar storeCookie options"} test http-cookiejar-4.7 "cookie storage: instance" -setup { http::cookiejar create ::cookiejar -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { cookiejar storeCookie { key foo value bar @@ -264,7 +264,7 @@ test http-cookiejar-4.7 "cookie storage: instance" -setup { test http-cookiejar-4.8 "cookie storage: instance" -setup { http::cookiejar create ::cookiejar oo::objdefine ::cookiejar export Database -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { cookiejar storeCookie { key foo value bar @@ -282,7 +282,7 @@ test http-cookiejar-4.8 "cookie storage: instance" -setup { test http-cookiejar-4.9 "cookie storage: instance" -setup { http::cookiejar create ::cookiejar oo::objdefine ::cookiejar export Database -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { cookiejar storeCookie { key foo value bar @@ -299,7 +299,7 @@ test http-cookiejar-4.9 "cookie storage: instance" -setup { } -result 0 test http-cookiejar-4.10 "cookie storage: instance" -setup { http::cookiejar create ::cookiejar -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { cookiejar storeCookie [dict replace { key foo value bar @@ -315,7 +315,7 @@ test http-cookiejar-4.10 "cookie storage: instance" -setup { test http-cookiejar-4.11 "cookie storage: instance" -setup { http::cookiejar create ::cookiejar oo::objdefine ::cookiejar export Database -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { cookiejar storeCookie [dict replace { key foo value bar @@ -333,7 +333,7 @@ test http-cookiejar-4.11 "cookie storage: instance" -setup { test http-cookiejar-4.12 "cookie storage: instance" -setup { http::cookiejar create ::cookiejar oo::objdefine ::cookiejar export Database -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { cookiejar storeCookie [dict replace { key foo value bar @@ -351,7 +351,7 @@ test http-cookiejar-4.12 "cookie storage: instance" -setup { test http-cookiejar-4.13 "cookie storage: instance" -setup { http::cookiejar create ::cookiejar set result {} -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { lappend result [cookiejar getCookies http www.example.com /] cookiejar storeCookie { key foo @@ -369,7 +369,7 @@ test http-cookiejar-4.13 "cookie storage: instance" -setup { test http-cookiejar-4.14 "cookie storage: instance" -setup { http::cookiejar create ::cookiejar set result {} -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { lappend result [cookiejar getCookies http www.example.com /] cookiejar storeCookie [dict replace { key foo @@ -387,7 +387,7 @@ test http-cookiejar-4.14 "cookie storage: instance" -setup { test http-cookiejar-4.15 "cookie storage: instance" -setup { http::cookiejar create ::cookiejar set result {} -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { lappend result [cookiejar getCookies http www.example.com /] cookiejar storeCookie { key foo @@ -414,7 +414,7 @@ test http-cookiejar-4.15 "cookie storage: instance" -setup { test http-cookiejar-4.16 "cookie storage: instance" -setup { http::cookiejar create ::cookiejar set result {} -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { lappend result [cookiejar getCookies http www.example.com /] cookiejar storeCookie { key foo1 @@ -440,7 +440,7 @@ test http-cookiejar-4.16 "cookie storage: instance" -setup { } -result {{} {foo1 bar foo2 bar}} test http-cookiejar-4.17 "cookie storage: instance" -setup { http::cookiejar create ::cookiejar -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { cookiejar lookup a b c d } -returnCodes error -cleanup { ::cookiejar destroy @@ -448,7 +448,7 @@ test http-cookiejar-4.17 "cookie storage: instance" -setup { test http-cookiejar-4.18 "cookie storage: instance" -setup { http::cookiejar create ::cookiejar set result {} -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { lappend result [cookiejar lookup] lappend result [cookiejar lookup www.example.com] lappend result [catch {cookiejar lookup www.example.com foo} value] $value @@ -470,7 +470,7 @@ test http-cookiejar-4.18 "cookie storage: instance" -setup { test http-cookiejar-4.19 "cookie storage: instance" -setup { http::cookiejar create ::cookiejar set result {} -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { cookiejar storeCookie { key foo value bar @@ -500,7 +500,7 @@ test http-cookiejar-4.19 "cookie storage: instance" -setup { test http-cookiejar-4.20 "cookie storage: instance" -setup { http::cookiejar create ::cookiejar set result {} -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { cookiejar storeCookie { key foo1 value bar1 @@ -529,7 +529,7 @@ test http-cookiejar-4.20 "cookie storage: instance" -setup { test http-cookiejar-4.21 "cookie storage: instance" -setup { http::cookiejar create ::cookiejar set result {} -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { cookiejar storeCookie { key foo1 value bar1 @@ -558,7 +558,7 @@ test http-cookiejar-4.21 "cookie storage: instance" -setup { test http-cookiejar-4.22 "cookie storage: instance" -setup { http::cookiejar create ::cookiejar set result {} -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { cookiejar forceLoadDomainData x y z } -returnCodes error -cleanup { ::cookiejar destroy @@ -566,14 +566,14 @@ test http-cookiejar-4.22 "cookie storage: instance" -setup { test http-cookiejar-4.23 "cookie storage: instance" -setup { http::cookiejar create ::cookiejar set result {} -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { cookiejar forceLoadDomainData } -cleanup { ::cookiejar destroy } -result {} test http-cookiejar-4.23.a {cookie storage: instance} -setup { set off [http::cookiejar configure -offline] -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { http::cookiejar configure -offline 1 [http::cookiejar create ::cookiejar] destroy } -cleanup { @@ -582,7 +582,7 @@ test http-cookiejar-4.23.a {cookie storage: instance} -setup { } -result {} test http-cookiejar-4.23.b {cookie storage: instance} -setup { set off [http::cookiejar configure -offline] -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { http::cookiejar configure -offline 0 [http::cookiejar create ::cookiejar] destroy } -cleanup { @@ -593,7 +593,7 @@ test http-cookiejar-4.23.b {cookie storage: instance} -setup { test http-cookiejar-5.1 "cookie storage: constraints" -setup { http::cookiejar create ::cookiejar cookiejar forceLoadDomainData -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { cookiejar storeCookie { key foo value bar @@ -610,7 +610,7 @@ test http-cookiejar-5.1 "cookie storage: constraints" -setup { test http-cookiejar-5.2 "cookie storage: constraints" -setup { http::cookiejar create ::cookiejar cookiejar forceLoadDomainData -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { cookiejar storeCookie { key foo value bar @@ -627,7 +627,7 @@ test http-cookiejar-5.2 "cookie storage: constraints" -setup { test http-cookiejar-5.3 "cookie storage: constraints" -setup { http::cookiejar create ::cookiejar cookiejar forceLoadDomainData -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { cookiejar storeCookie { key foo1 value bar @@ -653,7 +653,7 @@ test http-cookiejar-5.3 "cookie storage: constraints" -setup { test http-cookiejar-5.4 "cookie storage: constraints" -setup { http::cookiejar create ::cookiejar cookiejar forceLoadDomainData -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { cookiejar storeCookie { key foo value bar1 @@ -679,7 +679,7 @@ test http-cookiejar-5.4 "cookie storage: constraints" -setup { test http-cookiejar-5.5 "cookie storage: constraints" -setup { http::cookiejar create ::cookiejar cookiejar forceLoadDomainData -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { cookiejar storeCookie { key foo1 value 1 @@ -777,7 +777,7 @@ test http-cookiejar-6.1 "cookie storage: expiry and lookup" -setup { global result lappend result [lsort [lmap {k v} $cookies {set v}]] } -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { values [cookiejar getCookies http www.example.com /] cookiejar storeCookie { key foo @@ -833,7 +833,7 @@ test http-cookiejar-7.1 "cookie storage: persistence of persistent cookies" -set catch {rename ::cookiejar ""} set f [makeFile "" cookiejar] file delete $f -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { http::cookiejar create ::cookiejar $f ::cookiejar destroy http::cookiejar create ::cookiejar $f @@ -846,7 +846,7 @@ test http-cookiejar-7.2 "cookie storage: persistence of persistent cookies" -set set f [makeFile "" cookiejar] file delete $f set result {} -} -constraints {notOSXtravis sqlite3 cookiejar} -body { +} -constraints {cookiejar} -body { http::cookiejar create ::cookiejar $f cookiejar storeCookie [dict replace { key foo diff --git a/tests/link.test b/tests/link.test index 51a3b65..336634b 100644 --- a/tests/link.test +++ b/tests/link.test @@ -410,29 +410,29 @@ test link-8.3 {Tcl_UpdateLinkedVar procedure, read-only variable} {testlink} { } msg] $msg $int } {0 {} 47} -test link-9.1 {linkarray usage messages} -returnCodes error -body { +test link-9.1 {linkarray usage messages} -returnCodes error -constraints testlinkarray -body { testlinkarray } -result {wrong # args: should be "testlinkarray option args"} -test link-9.2 {linkarray usage messages} -returnCodes error -body { +test link-9.2 {linkarray usage messages} -returnCodes error -constraints testlinkarray -body { testlinkarray x } -result {bad option "x": must be update, remove, or create} -test link-9.3 {linkarray usage messages} -body { +test link-9.3 {linkarray usage messages} -constraints testlinkarray -body { testlinkarray update } -result {} -test link-9.4 {linkarray usage messages} -body { +test link-9.4 {linkarray usage messages} -constraints testlinkarray -body { testlinkarray remove } -result {} -test link-9.5 {linkarray usage messages} -returnCodes error -body { +test link-9.5 {linkarray usage messages} -returnCodes error -constraints testlinkarray -body { testlinkarray create } -result {wrong # args: should be "testlinkarray create ?-readonly? type size name ?address?"} -test link-9.6 {linkarray usage messages} -returnCodes error -body { +test link-9.6 {linkarray usage messages} -returnCodes error -constraints testlinkarray -body { testlinkarray create xx 1 my } -result {bad type "xx": must be char, uchar, short, ushort, int, uint, long, ulong, wide, uwide, float, double, string, char*, or binary} -test link-9.7 {linkarray usage messages} -returnCodes error -body { +test link-9.7 {linkarray usage messages} -returnCodes error -constraints testlinkarray -body { testlinkarray create char* 0 my } -result {wrong array size given} -test link-10.1 {linkarray char*} -setup { +test link-10.1 {linkarray char*} -constraints testlinkarray -setup { set mylist [list] } -body { testlinkarray create char* 1 ::my(var) @@ -443,7 +443,7 @@ test link-10.1 {linkarray char*} -setup { testlinkarray remove ::my(var) unset -nocomplain my } -result {{} {can't set "::my(var)": wrong size of char* value}} -test link-10.2 {linkarray char*} -body { +test link-10.2 {linkarray char*} -constraints testlinkarray -body { testlinkarray create char* 4 ::my(var) set ::my(var) x catch {set ::my(var) xyzz} msg @@ -452,7 +452,7 @@ test link-10.2 {linkarray char*} -body { testlinkarray remove ::my(var) unset -nocomplain my } -result {can't set "::my(var)": wrong size of char* value} -test link-10.3 {linkarray char*} -body { +test link-10.3 {linkarray char*} -constraints testlinkarray -body { testlinkarray create -r char* 4 ::my(var) catch {set ::my(var) x} msg return $msg @@ -461,7 +461,7 @@ test link-10.3 {linkarray char*} -body { unset -nocomplain my } -result {can't set "::my(var)": linked variable is read-only} -test link-11.1 {linkarray char} -setup { +test link-11.1 {linkarray char} -constraints testlinkarray -setup { set mylist [list] } -body { testlinkarray create char 1 ::my(var) @@ -474,7 +474,7 @@ test link-11.1 {linkarray char} -setup { testlinkarray remove ::my(var) unset -nocomplain my } -result {{can't set "::my(var)": variable must have char value} 120 {can't set "::my(var)": variable must have char value}} -test link-11.2 {linkarray char} -setup { +test link-11.2 {linkarray char} -constraints testlinkarray -setup { set mylist [list] } -body { testlinkarray create char 4 ::my(var) @@ -486,7 +486,7 @@ test link-11.2 {linkarray char} -setup { testlinkarray remove ::my(var) unset -nocomplain my } -result {{can't set "::my(var)": wrong dimension} {1 2 3 4}} -test link-11.3 {linkarray char} -body { +test link-11.3 {linkarray char} -constraints testlinkarray -body { testlinkarray create -r char 2 ::my(var) catch {set ::my(var) {1 2}} msg return $msg @@ -495,7 +495,7 @@ test link-11.3 {linkarray char} -body { unset -nocomplain my } -result {can't set "::my(var)": linked variable is read-only} -test link-12.1 {linkarray unsigned char} -setup { +test link-12.1 {linkarray unsigned char} -constraints testlinkarray -setup { set mylist [list] } -body { testlinkarray create uchar 1 ::my(var) @@ -510,7 +510,7 @@ test link-12.1 {linkarray unsigned char} -setup { testlinkarray remove ::my(var) unset -nocomplain my } -result {{can't set "::my(var)": variable must have unsigned char value} 120 {can't set "::my(var)": variable must have unsigned char value} {can't set "::my(var)": variable must have unsigned char value}} -test link-12.2 {linkarray unsigned char} -setup { +test link-12.2 {linkarray unsigned char} -constraints testlinkarray -setup { set mylist [list] } -body { testlinkarray create uchar 4 ::my(var) @@ -522,7 +522,7 @@ test link-12.2 {linkarray unsigned char} -setup { testlinkarray remove ::my(var) unset -nocomplain my } -result {{can't set "::my(var)": wrong dimension} {1 2 3 4}} -test link-12.3 {linkarray unsigned char} -body { +test link-12.3 {linkarray unsigned char} -constraints testlinkarray -body { testlinkarray create -r uchar 2 ::my(var) catch {set ::my(var) {1 2}} msg return $msg @@ -531,7 +531,7 @@ test link-12.3 {linkarray unsigned char} -body { unset -nocomplain my } -result {can't set "::my(var)": linked variable is read-only} -test link-13.1 {linkarray short} -setup { +test link-13.1 {linkarray short} -constraints testlinkarray -setup { set mylist [list] } -body { testlinkarray create short 1 ::my(var) @@ -544,7 +544,7 @@ test link-13.1 {linkarray short} -setup { testlinkarray remove ::my(var) unset -nocomplain my } -result {{can't set "::my(var)": variable must have short value} 120 {can't set "::my(var)": variable must have short value}} -test link-13.2 {linkarray short} -setup { +test link-13.2 {linkarray short} -constraints testlinkarray -setup { set mylist [list] } -body { testlinkarray create short 4 ::my(var) @@ -556,7 +556,7 @@ test link-13.2 {linkarray short} -setup { testlinkarray remove ::my(var) unset -nocomplain my } -result {{can't set "::my(var)": wrong dimension} {1 2 3 4}} -test link-13.3 {linkarray short} -body { +test link-13.3 {linkarray short} -constraints testlinkarray -body { testlinkarray create -r short 2 ::my(var) catch {set ::my(var) {1 2}} msg return $msg @@ -565,7 +565,7 @@ test link-13.3 {linkarray short} -body { unset -nocomplain my } -result {can't set "::my(var)": linked variable is read-only} -test link-14.1 {linkarray unsigned short} -setup { +test link-14.1 {linkarray unsigned short} -constraints testlinkarray -setup { set mylist [list] } -body { testlinkarray create ushort 1 ::my(var) @@ -580,7 +580,7 @@ test link-14.1 {linkarray unsigned short} -setup { testlinkarray remove ::my(var) unset -nocomplain my } -result {{can't set "::my(var)": variable must have unsigned short value} 120 {can't set "::my(var)": variable must have unsigned short value} {can't set "::my(var)": variable must have unsigned short value}} -test link-14.2 {linkarray unsigned short} -setup { +test link-14.2 {linkarray unsigned short} -constraints testlinkarray -setup { set mylist [list] } -body { testlinkarray create ushort 4 ::my(var) @@ -592,7 +592,7 @@ test link-14.2 {linkarray unsigned short} -setup { testlinkarray remove ::my(var) unset -nocomplain my } -result {{can't set "::my(var)": wrong dimension} {1 2 3 4}} -test link-14.3 {linkarray unsigned short} -body { +test link-14.3 {linkarray unsigned short} -constraints testlinkarray -body { testlinkarray create -r ushort 2 ::my(var) catch {set ::my(var) {1 2}} msg return $msg @@ -601,7 +601,7 @@ test link-14.3 {linkarray unsigned short} -body { unset -nocomplain my } -result {can't set "::my(var)": linked variable is read-only} -test link-15.1 {linkarray int} -setup { +test link-15.1 {linkarray int} -constraints testlinkarray -setup { set mylist [list] } -body { testlinkarray create int 1 ::my(var) @@ -614,7 +614,7 @@ test link-15.1 {linkarray int} -setup { testlinkarray remove ::my(var) unset -nocomplain my } -result {{can't set "::my(var)": variable must have integer value} 120 {can't set "::my(var)": variable must have integer value}} -test link-15.2 {linkarray int} -setup { +test link-15.2 {linkarray int} -constraints testlinkarray -setup { set mylist [list] } -body { testlinkarray create int 4 ::my(var) @@ -626,7 +626,7 @@ test link-15.2 {linkarray int} -setup { testlinkarray remove ::my(var) unset -nocomplain my } -result {{can't set "::my(var)": wrong dimension} {1 2 3 4}} -test link-15.3 {linkarray int} -body { +test link-15.3 {linkarray int} -constraints testlinkarray -body { testlinkarray create -r int 2 ::my(var) catch {set ::my(var) {1 2}} msg return $msg @@ -635,7 +635,7 @@ test link-15.3 {linkarray int} -body { unset -nocomplain my } -result {can't set "::my(var)": linked variable is read-only} -test link-16.1 {linkarray unsigned int} -setup { +test link-16.1 {linkarray unsigned int} -constraints testlinkarray -setup { set mylist [list] } -body { testlinkarray create uint 1 ::my(var) @@ -650,7 +650,7 @@ test link-16.1 {linkarray unsigned int} -setup { testlinkarray remove ::my(var) unset -nocomplain ::my } -result {{can't set "::my(var)": variable must have unsigned int value} 120 {can't set "::my(var)": variable must have unsigned int value} {can't set "::my(var)": variable must have unsigned int value}} -test link-16.2 {linkarray unsigned int} -setup { +test link-16.2 {linkarray unsigned int} -constraints testlinkarray -setup { set mylist [list] } -body { testlinkarray create uint 4 ::my(var) @@ -662,7 +662,7 @@ test link-16.2 {linkarray unsigned int} -setup { testlinkarray remove ::my(var) unset -nocomplain ::my } -result {{can't set "::my(var)": wrong dimension} {1 2 3 4}} -test link-16.3 {linkarray unsigned int} -body { +test link-16.3 {linkarray unsigned int} -constraints testlinkarray -body { testlinkarray create -r uint 2 ::my(var) catch {set ::my(var) {1 2}} msg return $msg @@ -671,7 +671,7 @@ test link-16.3 {linkarray unsigned int} -body { unset -nocomplain my } -result {can't set "::my(var)": linked variable is read-only} -test link-17.1 {linkarray long} -setup { +test link-17.1 {linkarray long} -constraints testlinkarray -setup { set mylist [list] } -body { testlinkarray create long 1 ::my(var) @@ -684,7 +684,7 @@ test link-17.1 {linkarray long} -setup { testlinkarray remove ::my(var) unset -nocomplain my } -result {{can't set "::my(var)": variable must have * value} 120 {can't set "::my(var)": variable must have * value}} -test link-17.2 {linkarray long} -setup { +test link-17.2 {linkarray long} -constraints testlinkarray -setup { set mylist [list] } -body { testlinkarray create long 4 ::my(var) @@ -696,7 +696,7 @@ test link-17.2 {linkarray long} -setup { testlinkarray remove ::my(var) unset -nocomplain my } -result {{can't set "::my(var)": wrong dimension} {1 2 3 4}} -test link-17.3 {linkarray long} -body { +test link-17.3 {linkarray long} -constraints testlinkarray -body { testlinkarray create -r long 2 ::my(var) catch {set ::my(var) {1 2}} msg return $msg @@ -705,7 +705,7 @@ test link-17.3 {linkarray long} -body { unset -nocomplain my } -result {can't set "::my(var)": linked variable is read-only} -test link-18.1 {linkarray unsigned long} -setup { +test link-18.1 {linkarray unsigned long} -constraints testlinkarray -setup { set mylist [list] } -body { testlinkarray create ulong 1 ::my(var) @@ -718,7 +718,7 @@ test link-18.1 {linkarray unsigned long} -setup { testlinkarray remove ::my(var) unset -nocomplain my } -result {{can't set "::my(var)": variable must have unsigned * value} 120 {can't set "::my(var)": variable must have unsigned * value}} -test link-18.2 {linkarray unsigned long} -body { +test link-18.2 {linkarray unsigned long} -constraints testlinkarray -body { testlinkarray create ulong 1 ::my(var) set ::my(var) 120 catch {set ::my(var) -1} msg @@ -727,7 +727,7 @@ test link-18.2 {linkarray unsigned long} -body { testlinkarray remove ::my(var) unset -nocomplain my } -result {can't set "::my(var)": variable must have unsigned * value} -test link-18.3 {linkarray unsigned long} -setup { +test link-18.3 {linkarray unsigned long} -constraints testlinkarray -setup { set mylist [list] } -body { testlinkarray create ulong 4 ::my(var) @@ -739,7 +739,7 @@ test link-18.3 {linkarray unsigned long} -setup { testlinkarray remove ::my(var) unset -nocomplain my } -result {{can't set "::my(var)": wrong dimension} {1 2 3 4}} -test link-18.4 {linkarray unsigned long} -body { +test link-18.4 {linkarray unsigned long} -constraints testlinkarray -body { testlinkarray create -r ulong 2 ::my(var) catch {set ::my(var) {1 2}} msg return $msg @@ -748,7 +748,7 @@ test link-18.4 {linkarray unsigned long} -body { unset -nocomplain my } -result {can't set "::my(var)": linked variable is read-only} -test link-19.1 {linkarray wide} -setup { +test link-19.1 {linkarray wide} -constraints testlinkarray -setup { set mylist [list] } -body { testlinkarray create wide 1 ::my(var) @@ -761,7 +761,7 @@ test link-19.1 {linkarray wide} -setup { testlinkarray remove ::my(var) unset -nocomplain my } -result {{can't set "::my(var)": variable must have wide integer value} 120 {can't set "::my(var)": variable must have wide integer value}} -test link-19.2 {linkarray wide} -setup { +test link-19.2 {linkarray wide} -constraints testlinkarray -setup { set mylist [list] } -body { testlinkarray create wide 4 ::my(var) @@ -773,7 +773,7 @@ test link-19.2 {linkarray wide} -setup { testlinkarray remove ::my(var) unset -nocomplain my } -result {{can't set "::my(var)": wrong dimension} {1 2 3 4}} -test link-19.3 {linkarray wide} -body { +test link-19.3 {linkarray wide} -constraints testlinkarray -body { testlinkarray create -r wide 2 ::my(var) catch {set ::my(var) {1 2}} msg return $msg @@ -782,7 +782,7 @@ test link-19.3 {linkarray wide} -body { unset -nocomplain my } -result {can't set "::my(var)": linked variable is read-only} -test link-20.1 {linkarray unsigned wide} -setup { +test link-20.1 {linkarray unsigned wide} -constraints testlinkarray -setup { set mylist [list] } -body { testlinkarray create uwide 1 ::my(var) @@ -796,7 +796,7 @@ test link-20.1 {linkarray unsigned wide} -setup { testlinkarray remove ::my(var) unset -nocomplain my } -result {{can't set "::my(var)": variable must have unsigned wide int value} 120 {can't set "::my(var)": variable must have unsigned wide int value} 0xbabed00dbabed00d} -test link-20.2 {linkarray unsigned wide} -body { +test link-20.2 {linkarray unsigned wide} -constraints testlinkarray -body { testlinkarray create uwide 1 ::my(var) set ::my(var) 120 catch {set ::my(var) -1} msg @@ -805,7 +805,7 @@ test link-20.2 {linkarray unsigned wide} -body { testlinkarray remove ::my(var) unset -nocomplain my } -result {can't set "::my(var)": variable must have unsigned wide int value} -test link-20.3 {linkarray unsigned wide} -setup { +test link-20.3 {linkarray unsigned wide} -constraints testlinkarray -setup { set mylist [list] } -body { testlinkarray create uwide 4 ::my(var) @@ -817,7 +817,7 @@ test link-20.3 {linkarray unsigned wide} -setup { testlinkarray remove ::my(var) unset -nocomplain my } -result {{can't set "::my(var)": wrong dimension} {1 2 3 4}} -test link-20.4 {linkarray unsigned wide} -body { +test link-20.4 {linkarray unsigned wide} -constraints testlinkarray -body { testlinkarray create -r uwide 2 ::my(var) catch {set ::my(var) {1 2}} msg return $msg @@ -826,7 +826,7 @@ test link-20.4 {linkarray unsigned wide} -body { unset -nocomplain my } -result {can't set "::my(var)": linked variable is read-only} -test link-21.1 {linkarray string} -setup { +test link-21.1 {linkarray string} -constraints testlinkarray -setup { set mylist [list] } -body { testlinkarray create string 1 ::my(var) @@ -837,7 +837,7 @@ test link-21.1 {linkarray string} -setup { testlinkarray remove ::my(var) unset -nocomplain my } -result {{} xyz xyz} -test link-21.2 {linkarray string} -body { +test link-21.2 {linkarray string} -constraints testlinkarray -body { testlinkarray create -r string 4 ::my(var) catch {set ::my(var) x} msg return $msg @@ -846,7 +846,7 @@ test link-21.2 {linkarray string} -body { unset -nocomplain my } -result {can't set "::my(var)": linked variable is read-only} -test link-22.1 {linkarray binary} -setup { +test link-22.1 {linkarray binary} -constraints testlinkarray -setup { set mylist [list] } -body { testlinkarray create binary 1 ::my(var) @@ -858,7 +858,7 @@ test link-22.1 {linkarray binary} -setup { testlinkarray remove ::my(var) unset -nocomplain my } -result {{can't set "::my(var)": wrong size of binary value} x} -test link-22.2 {linkarray binary} -setup { +test link-22.2 {linkarray binary} -constraints testlinkarray -setup { set mylist [list] } -body { testlinkarray create binary 4 ::my(var) @@ -872,7 +872,7 @@ test link-22.2 {linkarray binary} -setup { testlinkarray remove ::my(var) unset -nocomplain my } -result {{can't set "::my(var)": wrong size of binary value} {can't set "::my(var)": wrong size of binary value} abcd} -test link-22.3 {linkarray binary} -body { +test link-22.3 {linkarray binary} -constraints testlinkarray -body { testlinkarray create -r binary 4 ::my(var) catch {set ::my(var) xyzv} msg return $msg diff --git a/tests/oo.test b/tests/oo.test index 235a90d..3b56f30 100644 --- a/tests/oo.test +++ b/tests/oo.test @@ -111,8 +111,8 @@ test oo-0.8 {leak in variable management} -setup { } -result 0 test oo-0.9 {various types of presence of the TclOO package} { list [lsearch -nocase -all -inline [package names] tcloo] \ - [package present TclOO] [package versions TclOO] -} [list TclOO $::oo::patchlevel $::oo::patchlevel] + [package present TclOO] [expr {$::oo::patchlevel in [package versions TclOO]}] +} [list TclOO $::oo::patchlevel 1] test oo-1.1 {basic test of OO functionality: no classes} { set result {} diff --git a/tests/string.test b/tests/string.test index c54b5ba..b58aea2 100644 --- a/tests/string.test +++ b/tests/string.test @@ -121,10 +121,10 @@ test string-2.11.$noComp {string compare, unicode} { run {string compare ab\u7266 ab\u7267} } -1 test string-2.11.1.$noComp {string compare, unicode} { - run {string compare \334 \u00dc} + run {string compare \334 \xDC} } 0 test string-2.11.2.$noComp {string compare, unicode} { - run {string compare \334 \u00fc} + run {string compare \334 \xFC} } -1 test string-2.11.3.$noComp {string compare, unicode} { run {string compare \334\334\334\374\374 \334\334\334\334\334} @@ -151,10 +151,10 @@ test string-2.15.$noComp {string compare -nocase} { run {string compare -nocase abcde abcde} } 0 test string-2.15.1.$noComp {string compare -nocase} { - run {string compare -nocase \334 \u00dc} + run {string compare -nocase \334 \xDC} } 0 test string-2.15.2.$noComp {string compare -nocase} { - run {string compare -nocase \334\334\334\374\u00fc \334\334\334\334\334} + run {string compare -nocase \334\334\334\374\xFC \334\334\334\334\334} } 0 test string-2.16.$noComp {string compare -nocase with length} { run {string compare -length 2 -nocase abcde Abxyz} @@ -276,10 +276,10 @@ test string-3.16.$noComp {string equal, unicode} { run {string equal ab\u7266 ab\u7267} } 0 test string-3.17.$noComp {string equal, unicode} { - run {string equal \334 \u00dc} + run {string equal \334 \xDC} } 1 test string-3.18.$noComp {string equal, unicode} { - run {string equal \334 \u00fc} + run {string equal \334 \xFC} } 0 test string-3.19.$noComp {string equal, unicode} { run {string equal \334\334\334\374\374 \334\334\334\334\334} @@ -297,10 +297,10 @@ test string-3.21.$noComp {string equal -nocase} { run {string equal -nocase abcde Abdef} } 0 test string-3.22.$noComp {string equal, -nocase unicode} { - run {string equal -nocase \334 \u00dc} + run {string equal -nocase \334 \xDC} } 1 test string-3.23.$noComp {string equal, -nocase unicode} { - run {string equal -nocase \334\334\334\374\u00fc \334\334\334\334\334} + run {string equal -nocase \334\334\334\374\xFC \334\334\334\334\334} } 1 test string-3.24.$noComp {string equal -nocase with length} { run {string equal -length 2 -nocase abcde Abxyz} @@ -411,7 +411,7 @@ test string-4.15.$noComp {string first, ability to two-byte encoded utf-8 chars} # Test for a bug in Tcl 8.3 where test for all-single-byte-encoded # strings was incorrect, leading to an index returned by [string first] # which pointed past the end of the string. - set uchar \u057e ;# character with two-byte encoding in utf-8 + set uchar \u057E ;# character with two-byte encoding in utf-8 run {string first % %#$uchar$uchar#$uchar$uchar#% 3} } 8 test string-4.16.$noComp {string first, normal string vs pure unicode string} { @@ -559,7 +559,7 @@ test string-6.12.$noComp {string is alnum, true} { test string-6.13.$noComp {string is alnum, false} { list [run {string is alnum -failindex var abc1.23}] $var } {0 4} -test string-6.14.$noComp {string is alnum, unicode} "run {string is alnum abc\xfc}" 1 +test string-6.14.$noComp {string is alnum, unicode} "run {string is alnum abc\xFC}" 1 test string-6.15.$noComp {string is alpha, true} { run {string is alpha abc} } 1 @@ -570,10 +570,10 @@ test string-6.17.$noComp {string is alpha, unicode} { run {string is alpha abc\374} } 1 test string-6.18.$noComp {string is ascii, true} { - run {string is ascii abc\u007Fend\u0000} + run {string is ascii abc\x7Fend\x00} } 1 test string-6.19.$noComp {string is ascii, false} { - list [run {string is ascii -fail var abc\u0000def\u0080more}] $var + list [run {string is ascii -fail var abc\x00def\x80more}] $var } {0 7} test string-6.20.$noComp {string is boolean, true} { run {string is boolean true} @@ -591,7 +591,7 @@ test string-6.24.$noComp {string is digit, true} { run {string is digit 0123456789} } 1 test string-6.25.$noComp {string is digit, false} { - list [run {string is digit -fail var 0123\u00dc567}] $var + list [run {string is digit -fail var 0123\xDC567}] $var } {0 4} test string-6.26.$noComp {string is digit, false} { list [run {string is digit -fail var +123567}] $var @@ -714,7 +714,7 @@ test string-6.60.$noComp {string is lower, true} { run {string is lower abc} } 1 test string-6.61.$noComp {string is lower, unicode true} { - run {string is lower abc\u00fcue} + run {string is lower abc\xFCue} } 1 test string-6.62.$noComp {string is lower, false} { list [run {string is lower -fail var aBc}] $var @@ -723,7 +723,7 @@ test string-6.63.$noComp {string is lower, false} { list [run {string is lower -fail var abc1}] $var } {0 3} test string-6.64.$noComp {string is lower, unicode false} { - list [run {string is lower -fail var ab\u00dcUE}] $var + list [run {string is lower -fail var ab\xDCUE}] $var } {0 2} test string-6.65.$noComp {string is space, true} { run {string is space " \t\n\v\f"} @@ -761,7 +761,7 @@ test string-6.75.$noComp {string is upper, true} { run {string is upper ABC} } 1 test string-6.76.$noComp {string is upper, unicode true} { - run {string is upper ABC\u00dcUE} + run {string is upper ABC\xDCUE} } 1 test string-6.77.$noComp {string is upper, false} { list [run {string is upper -fail var AbC}] $var @@ -770,19 +770,19 @@ test string-6.78.$noComp {string is upper, false} { list [run {string is upper -fail var AB2C}] $var } {0 2} test string-6.79.$noComp {string is upper, unicode false} { - list [run {string is upper -fail var ABC\u00fcue}] $var + list [run {string is upper -fail var ABC\xFCue}] $var } {0 3} test string-6.80.$noComp {string is wordchar, true} { run {string is wordchar abc_123} } 1 test string-6.81.$noComp {string is wordchar, unicode true} { - run {string is wordchar abc\u00fcab\u00dcAB\u5001} + run {string is wordchar abc\xFCab\xDCAB\u5001} } 1 test string-6.82.$noComp {string is wordchar, false} { list [run {string is wordchar -fail var abcd.ef}] $var } {0 4} test string-6.83.$noComp {string is wordchar, unicode false} { - list [run {string is wordchar -fail var abc\u0080def}] $var + list [run {string is wordchar -fail var abc\x80def}] $var } {0 3} test string-6.84.$noComp {string is control} { ## Control chars are in the ranges @@ -798,14 +798,14 @@ test string-6.86.$noComp {string is graph} { } {0 14} test string-6.87.$noComp {string is print} { ## basically any printable char - list [run {string is print -fail var "0123abc!@#\$\u0100 \UE0100\UE01EF\u0010"}] $var + list [run {string is print -fail var "0123abc!@#\$\u0100 \UE0100\UE01EF\x10"}] $var } {0 15} test string-6.88.$noComp {string is punct} { ## any graph char that isn't alnum - list [run {string is punct -fail var "_!@#\u00beq0"}] $var + list [run {string is punct -fail var "_!@#\xBEq0"}] $var } {0 4} test string-6.89.$noComp {string is xdigit} { - list [run {string is xdigit -fail var 0123456789\u0061bcdefABCDEFg}] $var + list [run {string is xdigit -fail var 0123456789\x61bcdefABCDEFg}] $var } {0 22} test string-6.90.$noComp {string is integer, bad integers} { @@ -895,7 +895,7 @@ test string-6.108.$noComp {string is double, Bug 1382287} { run {string is double $x} } 0 test string-6.109.$noComp {string is double, Bug 1360532} { - run {string is double 1\u00a0} + run {string is double 1\xA0} } 0 test string-6.110.$noComp {string is entier, true} { run {string is entier +1234567890} @@ -1030,7 +1030,7 @@ test string-8.2.$noComp {string bytelength} { list [catch {run {string bytelength a b}} msg] $msg } {1 {wrong # args: should be "string bytelength string"}} test string-8.3.$noComp {string bytelength} { - run {string bytelength "\u00c7"} + run {string bytelength "\xC7"} } 2 test string-8.4.$noComp {string bytelength} { run {string b ""} @@ -1378,7 +1378,7 @@ test string-11.51.$noComp {string match; *, -nocase and UTF-8} { test string-11.52.$noComp {string match, null char in string} { set out "" set ptn "*abc*" - foreach elem [list "\u0000@abc" "@abc" "\u0000@abc\u0000" "blahabcblah"] { + foreach elem [list "\x00@abc" "@abc" "\x00@abc\x00" "blahabcblah"] { lappend out [run {string match $ptn $elem}] } set out @@ -1386,11 +1386,11 @@ test string-11.52.$noComp {string match, null char in string} { test string-11.53.$noComp {string match, null char in pattern} { set out "" foreach {ptn elem} [list \ - "*\u0000abc\u0000" "\u0000abc\u0000" \ - "*\u0000abc\u0000" "\u0000abc\u0000ef" \ - "*\u0000abc\u0000*" "\u0000abc\u0000ef" \ - "*\u0000abc\u0000" "@\u0000abc\u0000ef" \ - "*\u0000abc\u0000*" "@\u0000abc\u0000ef" \ + "*\x00abc\x00" "\x00abc\x00" \ + "*\x00abc\x00" "\x00abc\x00ef" \ + "*\x00abc\x00*" "\x00abc\x00ef" \ + "*\x00abc\x00" "@\x00abc\x00ef" \ + "*\x00abc\x00*" "@\x00abc\x00ef" \ ] { lappend out [run {string match $ptn $elem}] } @@ -1399,14 +1399,14 @@ test string-11.53.$noComp {string match, null char in pattern} { test string-11.54.$noComp {string match, failure} { set longString "" for {set i 0} {$i < 10} {incr i} { - append longString "abcdefghijklmnopqrstuvwxy\u0000z01234567890123" + append longString "abcdefghijklmnopqrstuvwxy\x00z01234567890123" } run {string first $longString 123} list [run {string match *cba* $longString}] \ - [run {string match *a*l*\u0000* $longString}] \ - [run {string match *a*l*\u0000*123 $longString}] \ - [run {string match *a*l*\u0000*123* $longString}] \ - [run {string match *a*l*\u0000*cba* $longString}] \ + [run {string match *a*l*\x00* $longString}] \ + [run {string match *a*l*\x00*123 $longString}] \ + [run {string match *a*l*\x00*123* $longString}] \ + [run {string match *a*l*\x00*cba* $longString}] \ [run {string match *===* $longString}] } {0 1 1 1 0 0} test string-11.55.$noComp {string match, invalid binary optimization} { @@ -1479,8 +1479,8 @@ test string-12.19.$noComp {string range, bytearray object} { run {string equal $r1 $r2} } 1 test string-12.20.$noComp {string range, out of bounds indices} { - run {string range \u00ff 0 1} -} \u00ff + run {string range \xFF 0 1} +} \xFF # Bug 1410553 test string-12.21.$noComp {string range, regenerates correct reps, bug 1410553} { set bytes "\x00 \x03 \x41" @@ -1648,7 +1648,7 @@ test stringComp-14.24.$noComp {Bug 1af8de570511} { }} 4 x } 0x00 test stringComp-14.25.$noComp {} { - string length [string replace [string repeat a\u00fe 2] 3 end {}] + string length [string replace [string repeat a\xFE 2] 3 end {}] } 3 test string-15.1.$noComp {string tolower too few args} { @@ -1679,8 +1679,8 @@ test string-15.9.$noComp {string tolower} { run {string tolower ABC 0 end-1} } abC test string-15.10.$noComp {string tolower, unicode} { - run {string tolower ABCabc\xc7\xe7} -} "abcabc\xe7\xe7" + run {string tolower ABCabc\xC7\xE7} +} "abcabc\xE7\xE7" test string-15.11.$noComp {string tolower, compiled} { lindex [run {string tolower [list A B [list C]]}] 1 } b @@ -1713,8 +1713,8 @@ test string-16.9.$noComp {string toupper} { run {string toupper abc 0 end-1} } ABc test string-16.10.$noComp {string toupper, unicode} { - run {string toupper ABCabc\xc7\xe7} -} "ABCABC\xc7\xc7" + run {string toupper ABCabc\xC7\xE7} +} "ABCABC\xC7\xC7" test string-16.11.$noComp {string toupper, compiled} { lindex [run {string toupper [list a b [list c]]}] 1 } B @@ -1735,11 +1735,11 @@ test string-17.5.$noComp {string totitle} { run {string totitle {123#$&*()}} } {123#$&*()} test string-17.6.$noComp {string totitle, unicode} { - run {string totitle ABCabc\xc7\xe7} -} "Abcabc\xe7\xe7" + run {string totitle ABCabc\xC7\xE7} +} "Abcabc\xE7\xE7" test string-17.7.$noComp {string totitle, unicode} { - run {string totitle \u01f3BCabc\xc7\xe7} -} "\u01f2bcabc\xe7\xe7" + run {string totitle \u01F3BCabc\xC7\xE7} +} "\u01F2bcabc\xE7\xE7" test string-17.8.$noComp {string totitle, compiled} { lindex [run {string totitle [list aa bb [list cc]]}] 0 } Aa @@ -1779,10 +1779,10 @@ test string-18.10.$noComp {string trim} { run {string trim ABC DEF} } {ABC} test string-18.11.$noComp {string trim, unicode} { - run {string trim "\xe7\xe8 AB\xe7C \xe8\xe7" \xe7\xe8} -} " AB\xe7C " + run {string trim "\xE7\xE8 AB\xE7C \xE8\xE7" \xE7\xE8} +} " AB\xE7C " test string-18.12.$noComp {string trim, unicode default} { - run {string trim \ufeff\x00\u0085\u00a0\u1680\u180eABC\u1361\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u202f\u205f\u3000} + run {string trim \uFEFF\x00\x85\xA0\u1680\u180EABC\u1361\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u200B\u2028\u2029\u202F\u205F\u3000} } ABC\u1361 test string-19.1.$noComp {string trimleft} { @@ -1792,7 +1792,7 @@ test string-19.2.$noComp {string trimleft} { run {string trimleft " XYZ "} } {XYZ } test string-19.3.$noComp {string trimleft, unicode default} { - run {string trimleft \ufeff\u0085\u00a0\x00\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u202f\u205f\u3000\u1361ABC} + run {string trimleft \uFEFF\x85\xA0\x00\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u200B\u2028\u2029\u202F\u205F\u3000\u1361ABC} } \u1361ABC test string-20.1.$noComp {string trimright errors} { @@ -1811,7 +1811,7 @@ test string-20.5.$noComp {string trimright} { run {string trimright ""} } {} test string-20.6.$noComp {string trimright, unicode default} { - run {string trimright ABC\u1361\u0085\x00\u00a0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u202f\u205f\u3000} + run {string trimright ABC\u1361\x85\x00\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u200B\u2028\u2029\u202F\u205F\u3000} } ABC\u1361 test string-21.1.$noComp {string wordend} { @@ -1842,19 +1842,19 @@ test string-21.9.$noComp {string wordend} { run {string worde "x.y" end-1} } 2 test string-21.10.$noComp {string wordend, unicode} { - run {string wordend "xyz\u00c7de fg" 0} + run {string wordend "xyz\xC7de fg" 0} } 6 test string-21.11.$noComp {string wordend, unicode} { - run {string wordend "xyz\uc700de fg" 0} + run {string wordend "xyz\uC700de fg" 0} } 6 test string-21.12.$noComp {string wordend, unicode} { - run {string wordend "xyz\u203fde fg" 0} + run {string wordend "xyz\u203Fde fg" 0} } 6 test string-21.13.$noComp {string wordend, unicode} { run {string wordend "xyz\u2045de fg" 0} } 3 test string-21.14.$noComp {string wordend, unicode} { - run {string wordend "\uc700\uc700 abc" 8} + run {string wordend "\uC700\uC700 abc" 8} } 6 test string-22.1.$noComp {string wordstart} { @@ -1888,13 +1888,13 @@ test string-22.10.$noComp {string wordstart} { run {string wordstart "one two three" end-5} } 7 test string-22.11.$noComp {string wordstart, unicode} { - run {string wordstart "one tw\u00c7o three" 7} + run {string wordstart "one tw\xC7o three" 7} } 4 test string-22.12.$noComp {string wordstart, unicode} { - run {string wordstart "ab\uc700\uc700 cdef ghi" 12} + run {string wordstart "ab\uC700\uC700 cdef ghi" 12} } 10 test string-22.13.$noComp {string wordstart, unicode} { - run {string wordstart "\uc700\uc700 abc" 8} + run {string wordstart "\uC700\uC700 abc" 8} } 3 test string-23.0.$noComp {string is boolean, Bug 1187123} testindexobj { @@ -1965,40 +1965,40 @@ test string-24.4.$noComp {string reverse command - unshared string} { run {string reverse $x$y} } edcba test string-24.5.$noComp {string reverse command - shared unicode string} { - set x abcde\ud0ad + set x abcde\uD0AD run {string reverse $x} -} \ud0adedcba +} \uD0ADedcba test string-24.6.$noComp {string reverse command - unshared string} { set x abc - set y de\ud0ad + set y de\uD0AD run {string reverse $x$y} -} \ud0adedcba +} \uD0ADedcba test string-24.7.$noComp {string reverse command - simple case} { run {string reverse a} } a test string-24.8.$noComp {string reverse command - simple case} { - run {string reverse \ud0ad} -} \ud0ad + run {string reverse \uD0AD} +} \uD0AD test string-24.9.$noComp {string reverse command - simple case} { run {string reverse {}} } {} test string-24.10.$noComp {string reverse command - corner case} { - set x \ubeef\ud0ad + set x \uBEEF\uD0AD run {string reverse $x} -} \ud0ad\ubeef +} \uD0AD\uBEEF test string-24.11.$noComp {string reverse command - corner case} { - set x \ubeef - set y \ud0ad + set x \uBEEF + set y \uD0AD run {string reverse $x$y} -} \ud0ad\ubeef +} \uD0AD\uBEEF test string-24.12.$noComp {string reverse command - corner case} { - set x \ubeef - set y \ud0ad + set x \uBEEF + set y \uD0AD run {string is ascii [run {string reverse $x$y}]} } 0 test string-24.13.$noComp {string reverse command - pure Unicode string} { - run {string reverse [run {string range \ubeef\ud0ad\ubeef\ud0ad\ubeef\ud0ad 1 5}]} -} \ud0ad\ubeef\ud0ad\ubeef\ud0ad + run {string reverse [run {string range \uBEEF\uD0AD\uBEEF\uD0AD\uBEEF\uD0AD 1 5}]} +} \uD0AD\uBEEF\uD0AD\uBEEF\uD0AD test string-24.14.$noComp {string reverse command - pure bytearray} { binary scan [run {string reverse [binary format H* 010203]}] H* x set x @@ -2054,7 +2054,7 @@ test string-25.13.$noComp {string is list} { } {0 2} test string-25.14.$noComp {string is list} { set x {} - list [run {string is list -failindex x "\uabcd {b c}d e"}] $x + list [run {string is list -failindex x "\uABCD {b c}d e"}] $x } {0 2} test string-26.1.$noComp {tcl::prefix, too few args} -body { @@ -2475,7 +2475,7 @@ test string-32.13.$noComp {string is dict} { } {0 2} test string-32.14.$noComp {string is dict} { set x {} - list [string is dict -failindex x "\uabcd {b c}d e"] $x + list [string is dict -failindex x "\uABCD {b c}d e"] $x } {0 2} test string-32.15.$noComp {string is dict, valid dict} { string is dict {a b c d e f} diff --git a/tests/utf.test b/tests/utf.test index 979c4a6..1d0f63a 100644 --- a/tests/utf.test +++ b/tests/utf.test @@ -27,34 +27,40 @@ test utf-1.1 {Tcl_UniCharToUtf: 1 byte sequences} testbytestring { expr {"\x01" eq [testbytestring "\x01"]} } 1 test utf-1.2 {Tcl_UniCharToUtf: 2 byte sequences} testbytestring { - expr {"\x00" eq [testbytestring "\xc0\x80"]} + expr {"\x00" eq [testbytestring "\xC0\x80"]} } 1 test utf-1.3 {Tcl_UniCharToUtf: 2 byte sequences} testbytestring { - expr {"\xe0" eq [testbytestring "\xc3\xa0"]} + expr {"\xE0" eq [testbytestring "\xC3\xA0"]} } 1 test utf-1.4 {Tcl_UniCharToUtf: 3 byte sequences} testbytestring { - expr {"\u4e4e" eq [testbytestring "\xe4\xb9\x8e"]} + expr {"\u4E4E" eq [testbytestring "\xE4\xB9\x8E"]} } 1 test utf-1.5 {Tcl_UniCharToUtf: overflowed Tcl_UniChar} testbytestring { - expr {[format %c 0x110000] eq [testbytestring "\xef\xbf\xbd"]} + expr {[format %c 0x110000] eq [testbytestring "\xEF\xBF\xBD"]} } 1 test utf-1.6 {Tcl_UniCharToUtf: negative Tcl_UniChar} testbytestring { - expr {[format %c -1] eq [testbytestring "\xef\xbf\xbd"]} + expr {[format %c -1] eq [testbytestring "\xEF\xBF\xBD"]} } 1 test utf-1.7 {Tcl_UniCharToUtf: 4 byte sequences} -constraints testbytestring -body { - expr {"\U014e4e" eq [testbytestring "\xf0\x94\xb9\x8e"]} + expr {"\U014E4E" eq [testbytestring "\xF0\x94\xB9\x8E"]} } -result 1 test utf-1.8 {Tcl_UniCharToUtf: 3 byte sequence, high surrogate} testbytestring { - expr {"\ud842" eq [testbytestring "\xed\xa1\x82"]} + expr {"\uD842" eq [testbytestring "\xED\xA1\x82"]} } 1 test utf-1.9 {Tcl_UniCharToUtf: 3 byte sequence, low surrogate} testbytestring { - expr {"\udc42" eq [testbytestring "\xed\xb1\x82"]} + expr {"\uDC42" eq [testbytestring "\xED\xB1\x82"]} } 1 test utf-1.10 {Tcl_UniCharToUtf: 3 byte sequence, high surrogate} testbytestring { - expr {[format %c 0xd842] eq [testbytestring "\xed\xa1\x82"]} + expr {[format %c 0xD842] eq [testbytestring "\xED\xA1\x82"]} } 1 test utf-1.11 {Tcl_UniCharToUtf: 3 byte sequence, low surrogate} testbytestring { - expr {[format %c 0xdc42] eq [testbytestring "\xed\xb1\x82"]} + expr {[format %c 0xDC42] eq [testbytestring "\xED\xB1\x82"]} +} 1 +test utf-1.12 {Tcl_UniCharToUtf: 4 byte sequence, high/low surrogate} testbytestring { + expr {"\uD842\uDC42" eq [testbytestring "\xF0\xA0\xA1\x82"]} +} 1 +test utf-1.13 {Tcl_UniCharToUtf: Invalid surrogate} testbytestring { + expr {"\UD842" eq [testbytestring "\xEF\xBF\xBD"]} } 1 test utf-2.1 {Tcl_UtfToUniChar: low ascii} { @@ -67,7 +73,7 @@ test utf-2.3 {Tcl_UtfToUniChar: lead (2-byte) followed by non-trail} testbytestr string length [testbytestring "\xC2"] } {1} test utf-2.4 {Tcl_UtfToUniChar: lead (2-byte) followed by trail} testbytestring { - string length [testbytestring "\xC2\xa2"] + string length [testbytestring "\xC2\xA2"] } {1} test utf-2.5 {Tcl_UtfToUniChar: lead (3-byte) followed by non-trail} testbytestring { string length [testbytestring "\xE2"] @@ -76,7 +82,7 @@ test utf-2.6 {Tcl_UtfToUniChar: lead (3-byte) followed by 1 trail} testbytestrin string length [testbytestring "\xE2\xA2"] } {2} test utf-2.7 {Tcl_UtfToUniChar: lead (3-byte) followed by 2 trail} testbytestring { - string length [testbytestring "\xE4\xb9\x8e"] + string length [testbytestring "\xE4\xB9\x8E"] } {1} test utf-2.8 {Tcl_UtfToUniChar: lead (4-byte) followed by 3 trail} -constraints {tip389 testbytestring} -body { string length [testbytestring "\xF0\x90\x80\x80"] @@ -150,27 +156,27 @@ test utf-8.1 {Tcl_UniCharAtIndex: index = 0} { string index abcd 0 } {a} test utf-8.2 {Tcl_UniCharAtIndex: index = 0} { - string index \u4e4e\u25a 0 -} "\u4e4e" + string index \u4E4E\u25A 0 +} "\u4E4E" test utf-8.3 {Tcl_UniCharAtIndex: index > 0} { string index abcd 2 } {c} test utf-8.4 {Tcl_UniCharAtIndex: index > 0} { - string index \u4e4e\u25a\xff\u543 2 -} "\uff" + string index \u4E4E\u25A\xFF\u543 2 +} "\uFF" test utf-8.5 {Tcl_UniCharAtIndex: high surrogate} { - string index \ud842 0 -} "\ud842" + string index \uD842 0 +} "\uD842" test utf-8.6 {Tcl_UniCharAtIndex: low surrogate} { - string index \udc42 0 -} "\udc42" + string index \uDC42 0 +} "\uDC42" test utf-9.1 {Tcl_UtfAtIndex: index = 0} { string range abcd 0 2 } {abc} test utf-9.2 {Tcl_UtfAtIndex: index > 0} { - string range \u4e4e\u25a\xff\u543klmnop 1 5 -} "\u25a\xff\u543kl" + string range \u4E4E\u25A\xFF\u543klmnop 1 5 +} "\u25A\xFF\u543kl" test utf-10.1 {Tcl_UtfBackslash: dst == NULL} { @@ -178,22 +184,22 @@ test utf-10.1 {Tcl_UtfBackslash: dst == NULL} { } { } test utf-10.2 {Tcl_UtfBackslash: \u subst} testbytestring { - expr {"\ua2" eq [testbytestring "\xc2\xa2"]} + expr {"\uA2" eq [testbytestring "\xC2\xA2"]} } 1 test utf-10.3 {Tcl_UtfBackslash: longer \u subst} testbytestring { - expr {"\u4e21" eq [testbytestring "\xe4\xb8\xa1"]} + expr {"\u4E21" eq [testbytestring "\xE4\xB8\xA1"]} } 1 test utf-10.4 {Tcl_UtfBackslash: stops at first non-hex} testbytestring { - expr {"\u4e2k" eq "[testbytestring \xd3\xa2]k"} + expr {"\u4E2k" eq "[testbytestring \xD3\xA2]k"} } 1 test utf-10.5 {Tcl_UtfBackslash: stops after 4 hex chars} testbytestring { - expr {"\u4e216" eq "[testbytestring \xe4\xb8\xa1]6"} + expr {"\u4E216" eq "[testbytestring \xE4\xB8\xA1]6"} } 1 test utf-10.6 {Tcl_UtfBackslash: stops after 5 hex chars} testbytestring { - expr {"\U1e2165" eq "[testbytestring \xf0\x9e\x88\x96]5"} + expr {"\U1E2165" eq "[testbytestring \xF0\x9E\x88\x96]5"} } 1 test utf-10.7 {Tcl_UtfBackslash: stops after 6 hex chars} testbytestring { - expr {"\U10e2165" eq "[testbytestring \xf4\x8e\x88\x96]5"} + expr {"\U10E2165" eq "[testbytestring \xF4\x8E\x88\x96]5"} } 1 proc bsCheck {char num} { global errNum @@ -239,8 +245,8 @@ bsCheck \u41 65 bsCheck \ua 10 bsCheck \uA 10 bsCheck \340 224 -bsCheck \ua1 161 -bsCheck \u4e21 20001 +bsCheck \uA1 161 +bsCheck \u4E21 20001 bsCheck \741 60 bsCheck \U 85 bsCheck \Uk 85 @@ -248,10 +254,10 @@ bsCheck \U41 65 bsCheck \Ua 10 bsCheck \UA 10 bsCheck \Ua1 161 -bsCheck \U4e21 20001 -bsCheck \U004e21 20001 -bsCheck \U00004e21 20001 -bsCheck \U0000004e21 78 +bsCheck \U4E21 20001 +bsCheck \U004E21 20001 +bsCheck \U00004E21 20001 +bsCheck \U0000004E21 78 bsCheck \U00110000 69632 bsCheck \U01100000 69632 bsCheck \U11000000 69632 @@ -267,17 +273,17 @@ test utf-11.2 {Tcl_UtfToUpper} { string toupper abc } ABC test utf-11.3 {Tcl_UtfToUpper} { - string toupper \u00e3ab -} \u00c3AB + string toupper \xE3AB +} \xC3AB test utf-11.4 {Tcl_UtfToUpper} { - string toupper \u01e3ab -} \u01e2AB + string toupper \u01E3AB +} \u01E2AB test utf-11.5 {Tcl_UtfToUpper Georgian (new in Unicode 11)} { - string toupper \u10d0\u1c90 -} \u1c90\u1c90 + string toupper \u10D0\u1C90 +} \u1C90\u1C90 test utf-11.6 {Tcl_UtfToUpper low/high surrogate)} { - string toupper \udc24\ud824 -} \udc24\ud824 + string toupper \uDC24\uD824 +} \uDC24\uD824 test utf-12.1 {Tcl_UtfToLower} { string tolower {} @@ -286,17 +292,17 @@ test utf-12.2 {Tcl_UtfToLower} { string tolower ABC } abc test utf-12.3 {Tcl_UtfToLower} { - string tolower \u00c3AB -} \u00e3ab + string tolower \xC3AB +} \xE3ab test utf-12.4 {Tcl_UtfToLower} { - string tolower \u01e2AB -} \u01e3ab + string tolower \u01E2AB +} \u01E3ab test utf-12.5 {Tcl_UtfToLower Georgian (new in Unicode 11)} { - string tolower \u10d0\u1c90 -} \u10d0\u10d0 + string tolower \u10D0\u1C90 +} \u10D0\u10D0 test utf-12.6 {Tcl_UtfToUpper low/high surrogate)} { - string tolower \udc24\ud824 -} \udc24\ud824 + string tolower \uDC24\uD824 +} \uDC24\uD824 test utf-13.1 {Tcl_UtfToTitle} { string totitle {} @@ -305,20 +311,20 @@ test utf-13.2 {Tcl_UtfToTitle} { string totitle abc } Abc test utf-13.3 {Tcl_UtfToTitle} { - string totitle \u00e3ab -} \u00c3ab + string totitle \xE3AB +} \xC3ab test utf-13.4 {Tcl_UtfToTitle} { - string totitle \u01f3ab -} \u01f2ab + string totitle \u01F3AB +} \u01F2ab test utf-13.5 {Tcl_UtfToTitle Georgian (new in Unicode 11)} { - string totitle \u10d0\u1c90 -} \u10d0\u1c90 + string totitle \u10D0\u1C90 +} \u10D0\u1C90 test utf-13.6 {Tcl_UtfToTitle Georgian (new in Unicode 11)} { - string totitle \u1c90\u10d0 -} \u1c90\u10d0 + string totitle \u1C90\u10D0 +} \u1C90\u10D0 test utf-13.7 {Tcl_UtfToTitle low/high surrogate)} { - string totitle \udc24\ud824 -} \udc24\ud824 + string totitle \uDC24\uD824 +} \uDC24\uD824 test utf-14.1 {Tcl_UtfNcasecmp} { string compare -nocase a b @@ -337,7 +343,7 @@ test utf-15.1 {Tcl_UniCharToUpper, negative delta} { string toupper aA } AA test utf-15.2 {Tcl_UniCharToUpper, positive delta} { - string toupper \u0178\u00ff + string toupper \u0178\xFF } \u0178\u0178 test utf-15.3 {Tcl_UniCharToUpper, no delta} { string toupper ! @@ -347,24 +353,24 @@ test utf-16.1 {Tcl_UniCharToLower, negative delta} { string tolower aA } aa test utf-16.2 {Tcl_UniCharToLower, positive delta} { - string tolower \u0178\u00ff\uA78D\u01c5\U10400 -} \u00ff\u00ff\u0265\u01c6\U10428 + string tolower \u0178\xFF\uA78D\u01C5\U10400 +} \xFF\xFF\u0265\u01C6\U10428 test utf-17.1 {Tcl_UniCharToLower, no delta} { string tolower ! } ! test utf-18.1 {Tcl_UniCharToTitle, add one for title} { - string totitle \u01c4 -} \u01c5 + string totitle \u01C4 +} \u01C5 test utf-18.2 {Tcl_UniCharToTitle, subtract one for title} { - string totitle \u01c6 -} \u01c5 + string totitle \u01C6 +} \u01C5 test utf-18.3 {Tcl_UniCharToTitle, subtract delta for title (positive)} { - string totitle \u017f -} \u0053 + string totitle \u017F +} \x53 test utf-18.4 {Tcl_UniCharToTitle, subtract delta for title (negative)} { - string totitle \u00ff + string totitle \xFF } \u0178 test utf-18.5 {Tcl_UniCharToTitle, no delta} { string totitle ! @@ -381,15 +387,15 @@ test utf-20.1 {TclUniCharNcmp} { test utf-21.1 {TclUniCharIsAlnum} { # this returns 1 with Unicode 7 compliance - string is alnum \u1040\u021f\u0220 + string is alnum \u1040\u021F\u0220 } {1} test utf-21.2 {unicode alnum char in regc_locale.c} { # this returns 1 with Unicode 7 compliance - list [regexp {^[[:alnum:]]+$} \u1040\u021f\u0220] [regexp {^\w+$} \u1040\u021f\u0220_\u203f\u2040\u2054\ufe33\ufe34\ufe4d\ufe4e\ufe4f\uff3f] + list [regexp {^[[:alnum:]]+$} \u1040\u021F\u0220] [regexp {^\w+$} \u1040\u021F\u0220_\u203F\u2040\u2054\uFE33\uFE34\uFE4D\uFE4E\uFE4F\uFF3F] } {1 1} test utf-21.3 {unicode print char in regc_locale.c} { # this returns 1 with Unicode 7 compliance - regexp {^[[:print:]]+$} \ufbc1 + regexp {^[[:print:]]+$} \uFBC1 } 1 test utf-21.4 {TclUniCharIsGraph} { # [Bug 3464428] @@ -401,65 +407,65 @@ test utf-21.5 {unicode graph char in regc_locale.c} { } {1} test utf-21.6 {TclUniCharIsGraph} { # [Bug 3464428] - string is graph \u00a0 + string is graph \xA0 } {0} test utf-21.7 {unicode graph char in regc_locale.c} { # [Bug 3464428] - regexp {[[:graph:]]} \u0020\u00a0\u2028\u2029 + regexp {[[:graph:]]} \x20\xA0\u2028\u2029 } {0} test utf-21.8 {TclUniCharIsPrint} { # [Bug 3464428] - string is print \u0009 + string is print \x09 } {0} test utf-21.9 {unicode print char in regc_locale.c} { # [Bug 3464428] - regexp {[[:print:]]} \u0009 + regexp {[[:print:]]} \x09 } {0} test utf-21.10 {unicode print char in regc_locale.c} { # [Bug 3464428] - regexp {[[:print:]]} \u0009 + regexp {[[:print:]]} \x09 } {0} test utf-21.11 {TclUniCharIsControl} { # [Bug 3464428] - string is control \u0000\u001f\u00ad\u0605\u061c\u180e\u2066\ufeff + string is control \x00\x1F\xAD\u0605\u061C\u180E\u2066\uFEFF } {1} test utf-21.12 {unicode control char in regc_locale.c} { # [Bug 3464428], [Bug a876646efe] - regexp {^[[:cntrl:]]*$} \u0000\u001f\u00ad\u0605\u061c\u180e\u2066\ufeff + regexp {^[[:cntrl:]]*$} \x00\x1F\xAD\u0605\u061C\u180E\u2066\uFEFF } {1} test utf-22.1 {TclUniCharIsWordChar} { string wordend "xyz123_bar fg" 0 } 10 test utf-22.2 {TclUniCharIsWordChar} { - string wordend "x\u5080z123_bar\u203c fg" 0 + string wordend "x\u5080z123_bar\u203C fg" 0 } 10 test utf-23.1 {TclUniCharIsAlpha} { # this returns 1 with Unicode 7 compliance - string is alpha \u021f\u0220\u037f\u052f + string is alpha \u021F\u0220\u037F\u052F } {1} test utf-23.2 {unicode alpha char in regc_locale.c} { # this returns 1 with Unicode 7 compliance - regexp {^[[:alpha:]]+$} \u021f\u0220\u037f\u052f + regexp {^[[:alpha:]]+$} \u021F\u0220\u037F\u052F } {1} test utf-24.1 {TclUniCharIsDigit} { # this returns 1 with Unicode 7 compliance - string is digit \u1040\uabf0 + string is digit \u1040\uABF0 } {1} test utf-24.2 {unicode digit char in regc_locale.c} { # this returns 1 with Unicode 7 compliance - list [regexp {^[[:digit:]]+$} \u1040\uabf0] [regexp {^\d+$} \u1040\uabf0] + list [regexp {^[[:digit:]]+$} \u1040\uABF0] [regexp {^\d+$} \u1040\uABF0] } {1 1} test utf-24.3 {TclUniCharIsSpace} { # this returns 1 with Unicode 7/TIP 413 compliance - string is space \u0085\u1680\u180e\u200b\u202f\u2060 + string is space \x85\u1680\u180E\u200B\u202F\u2060 } {1} test utf-24.4 {unicode space char in regc_locale.c} { # this returns 1 with Unicode 7/TIP 413 compliance - list [regexp {^[[:space:]]+$} \u0085\u1680\u180e\u200b\u202f\u2060] [regexp {^\s+$} \u0085\u1680\u180e\u200b\u202f\u2060] + list [regexp {^[[:space:]]+$} \x85\u1680\u180E\u200B\u202F\u2060] [regexp {^\s+$} \x85\u1680\u180E\u200B\u202F\u2060] } {1 1} testConstraint teststringobj [llength [info commands teststringobj]] diff --git a/tools/fix_tommath_h.tcl b/tools/fix_tommath_h.tcl deleted file mode 100755 index cee29fa..0000000 --- a/tools/fix_tommath_h.tcl +++ /dev/null @@ -1,103 +0,0 @@ -# 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. -#---------------------------------------------------------------------- - -set f [open [lindex $argv 0] r] -set data [read $f] -close $f - -set eat_endif 0 -set eat_semi 0 -set def_count 0 -foreach line [split $data \n] { - if {!$eat_semi && !$eat_endif} { - switch -regexp -- $line { - {#define BN_H_} { - puts $line - puts {} - puts "\#include \"tclTomMathDecls.h\"" - puts "\#ifndef MODULE_SCOPE" - puts "\#define MODULE_SCOPE extern" - puts "\#endif" - } - {typedef\s+unsigned long\s+mp_digit;} { - # change the second 'typedef unsigned long mp - incr def_count - puts "\#ifndef MP_DIGIT_DECLARED" - if {$def_count == 2} { - puts [string map {long int} $line] - } else { - puts $line - } - puts "\#define MP_DIGIT_DECLARED" - puts "\#endif" - } - {typedef.*mp_digit;} { - puts "\#ifndef MP_DIGIT_DECLARED" - puts $line - puts "\#define MP_DIGIT_DECLARED" - puts "\#endif" - } - {typedef.*mp_word;} { - puts "\#ifndef MP_WORD_DECLARED" - puts $line - puts "\#define MP_WORD_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 "/*" - puts $line - set eat_semi 1 - set after_semi "*/" - } - {^extern (int|const)} { - puts "\#if defined(BUILD_tcl) || !defined(_WIN32)" - puts [regsub {^extern} $line "MODULE_SCOPE"] - set eat_semi 1 - set after_semi "\#endif" - } - {define heap macros} { - puts $line - puts "\#if 0 /* these are macros in tclTomMathDecls.h */" - set eat_endif 1 - } - {#include} { - # remove all includes - } - default { - puts $line - } - } - } else { - puts $line - } - if {$eat_semi} { - if {[regexp {; *$} $line]} { - puts $after_semi - set eat_semi 0 - } - } - if {$eat_endif} { - if {[regexp {^\#endif} $line]} { - puts "\#endif" - set eat_endif 0 - } - } -} diff --git a/unix/Makefile.in b/unix/Makefile.in index 33b3ba8..9a652fa 100644 --- a/unix/Makefile.in +++ b/unix/Makefile.in @@ -230,7 +230,6 @@ SRC_DIR = @srcdir@ TOP_DIR = @TCL_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 = $(TOP_DIR)/unix @@ -243,6 +242,8 @@ TCL_BUILDTIME_LIBRARY = @TCL_SRC_DIR@/library ZLIB_DIR = ${COMPAT_DIR}/zlib ZLIB_INCLUDE = @ZLIB_INCLUDE@ +TOMMATH_DIR = $(TOP_DIR)/libtommath +TOMMATH_INCLUDE = @TOMMATH_INCLUDE@ CC = @CC@ OBJEXT = @OBJEXT@ @@ -277,8 +278,8 @@ VALGRINDARGS = --tool=memcheck --num-callers=24 \ # modify it and you shouldn't need to modify it either. #-------------------------------------------------------------------------- -STUB_CC_SWITCHES = ${CFLAGS} ${CFLAGS_WARNING} ${SHLIB_CFLAGS} \ - -I"${BUILD_DIR}" -I${UNIX_DIR} -I${GENERIC_DIR} -I${TOMMATH_DIR} \ +STUB_CC_SWITCHES = -I"${BUILD_DIR}" -I${UNIX_DIR} -I${GENERIC_DIR} -I${TOMMATH_DIR} \ + ${CFLAGS} ${CFLAGS_WARNING} ${SHLIB_CFLAGS} \ ${AC_FLAGS} ${PROTO_FLAGS} ${ENV_FLAGS} ${EXTRA_CFLAGS} \ @EXTRA_CC_SWITCHES@ @@ -329,16 +330,17 @@ TOMMATH_OBJS = bn_s_mp_reverse.o bn_s_mp_mul_digs_fast.o \ bn_mp_cnt_lsb.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_expt_u32.o \ - bn_mp_get_mag_ul.o bn_mp_grow.o bn_mp_init.o \ + bn_mp_get_mag_u64.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_init_ul.o bn_s_mp_karatsuba_mul.o \ - bn_mp_init_l.o bn_mp_init_ll.o bn_mp_init_ull.o \ + bn_mp_init_size.o bn_s_mp_karatsuba_mul.o \ + bn_mp_init_i64.o bn_mp_init_u64.o \ bn_s_mp_karatsuba_sqr.o bn_s_mp_balance_mul.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_neg.o bn_mp_or.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_set_ul.o \ - bn_mp_shrink.o bn_mp_set_l.o \ + bn_mp_radix_size.o bn_mp_radix_smap.o bn_mp_set_i64.o \ + bn_mp_read_radix.o bn_mp_rshd.o \ + bn_mp_set_u64.o bn_mp_shrink.o \ bn_mp_sqr.o bn_mp_sqrt.o bn_mp_sub.o bn_mp_sub_d.o \ bn_mp_signed_rsh.o \ bn_mp_to_ubin.o \ @@ -374,7 +376,7 @@ ZLIB_OBJS = Zadler32.o Zcompress.o Zcrc32.o Zdeflate.o Zinfback.o \ TCL_OBJS = ${GENERIC_OBJS} ${UNIX_OBJS} ${NOTIFY_OBJS} ${COMPAT_OBJS} \ ${OO_OBJS} @DL_OBJS@ @PLAT_OBJS@ -OBJS = ${TCL_OBJS} ${TOMMATH_OBJS} @DTRACE_OBJ@ @ZLIB_OBJS@ +OBJS = ${TCL_OBJS} @DTRACE_OBJ@ @ZLIB_OBJS@ @TOMMATH_OBJS@ TCL_DECLS = \ $(GENERIC_DIR)/tcl.decls \ @@ -721,8 +723,8 @@ ZLIB_SRCS = \ # won't compile on the current machine, and they will cause problems for # things like "make depend". -SRCS = $(GENERIC_SRCS) $(TOMMATH_SRCS) $(UNIX_SRCS) $(NOTIFY_SRCS) \ - $(OO_SRCS) $(STUB_SRCS) @PLAT_SRCS@ @ZLIB_SRCS@ +SRCS = $(GENERIC_SRCS) $(UNIX_SRCS) $(NOTIFY_SRCS) \ + $(OO_SRCS) $(STUB_SRCS) @PLAT_SRCS@ @ZLIB_SRCS@ @TOMMATH_SRCS@ ### # Tip 430 - ZipFS Modifications @@ -1035,7 +1037,10 @@ install-libraries: libraries $(INSTALL_DATA) $$i "$(SCRIPT_INSTALL_DIR)"; \ done @echo "Installing package cookiejar 0.2 files to $(SCRIPT_INSTALL_DIR)/cookiejar0.2/" - @for i in $(TOP_DIR)/library/cookiejar/*.{tcl,txt.gz}; do \ + @for i in $(TOP_DIR)/library/cookiejar/*.tcl; do \ + $(INSTALL_DATA) $$i "$(SCRIPT_INSTALL_DIR)"/cookiejar0.2; \ + done + @for i in $(TOP_DIR)/library/cookiejar/*.gz; do \ $(INSTALL_DATA) $$i "$(SCRIPT_INSTALL_DIR)"/cookiejar0.2; \ done @echo "Installing package http 2.9.1 as a Tcl Module" @@ -1048,9 +1053,9 @@ install-libraries: libraries @echo "Installing package msgcat 1.7.0 as a Tcl Module" @$(INSTALL_DATA) $(TOP_DIR)/library/msgcat/msgcat.tcl \ "$(MODULE_INSTALL_DIR)"/tcl9/9.0/msgcat-1.7.0.tm - @echo "Installing package tcltest 2.5.1 as a Tcl Module" + @echo "Installing package tcltest 2.5.2 as a Tcl Module" @$(INSTALL_DATA) $(TOP_DIR)/library/tcltest/tcltest.tcl \ - "$(MODULE_INSTALL_DIR)"/tcl9/9.0/tcltest-2.5.1.tm + "$(MODULE_INSTALL_DIR)"/tcl9/9.0/tcltest-2.5.2.tm @echo "Installing package platform 1.0.14 as a Tcl Module" @$(INSTALL_DATA) $(TOP_DIR)/library/platform/platform.tcl \ "$(MODULE_INSTALL_DIR)"/tcl9/9.0/platform-1.0.14.tm @@ -1221,7 +1226,7 @@ TCLREHDRS = $(GENERIC_DIR)/tclRegexp.h COMPILEHDR = $(GENERIC_DIR)/tclCompile.h FSHDR = $(GENERIC_DIR)/tclFileSystem.h IOHDR = $(GENERIC_DIR)/tclIO.h -MATHHDRS = $(GENERIC_DIR)/tommath.h $(GENERIC_DIR)/tclTomMath.h +MATHHDRS = $(GENERIC_DIR)/tclTomMath.h $(GENERIC_DIR)/tclTomMathDecls.h PARSEHDR = $(GENERIC_DIR)/tclParse.h NREHDR = $(GENERIC_DIR)/tclInt.h TRIMHDR = $(GENERIC_DIR)/tclStringTrim.h @@ -1624,8 +1629,8 @@ bn_mp_exch.o: $(TOMMATH_DIR)/bn_mp_exch.c $(MATHHDRS) bn_mp_expt_u32.o: $(TOMMATH_DIR)/bn_mp_expt_u32.c $(MATHHDRS) $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_expt_u32.c -bn_mp_get_mag_ul.o: $(TOMMATH_DIR)/bn_mp_get_mag_ul.c $(MATHHDRS) - $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_get_mag_ul.c +bn_mp_get_mag_u64.o: $(TOMMATH_DIR)/bn_mp_get_mag_u64.c $(MATHHDRS) + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_get_mag_u64.c bn_mp_grow.o: $(TOMMATH_DIR)/bn_mp_grow.c $(MATHHDRS) $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_grow.c @@ -1636,11 +1641,8 @@ bn_mp_init.o: $(TOMMATH_DIR)/bn_mp_init.c $(MATHHDRS) bn_mp_init_copy.o: $(TOMMATH_DIR)/bn_mp_init_copy.c $(MATHHDRS) $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_init_copy.c -bn_mp_init_l.o:$(TOMMATH_DIR)/bn_mp_init_l.c $(MATHHDRS) - $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_init_l.c - -bn_mp_init_ll.o:$(TOMMATH_DIR)/bn_mp_init_ll.c $(MATHHDRS) - $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_init_ll.c +bn_mp_init_i64.o:$(TOMMATH_DIR)/bn_mp_init_i64.c $(MATHHDRS) + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_init_i64.c bn_mp_init_multi.o: $(TOMMATH_DIR)/bn_mp_init_multi.c $(MATHHDRS) $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_init_multi.c @@ -1651,11 +1653,8 @@ bn_mp_init_set.o: $(TOMMATH_DIR)/bn_mp_init_set.c $(MATHHDRS) bn_mp_init_size.o:$(TOMMATH_DIR)/bn_mp_init_size.c $(MATHHDRS) $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_init_size.c -bn_mp_init_ul.o:$(TOMMATH_DIR)/bn_mp_init_ul.c $(MATHHDRS) - $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_init_ul.c - -bn_mp_init_ull.o:$(TOMMATH_DIR)/bn_mp_init_ull.c $(MATHHDRS) - $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_init_ull.c +bn_mp_init_u64.o:$(TOMMATH_DIR)/bn_mp_init_u64.c $(MATHHDRS) + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_init_u64.c bn_s_mp_karatsuba_mul.o: $(TOMMATH_DIR)/bn_s_mp_karatsuba_mul.c $(MATHHDRS) $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_s_mp_karatsuba_mul.c @@ -1705,14 +1704,11 @@ bn_mp_read_radix.o: $(TOMMATH_DIR)/bn_mp_read_radix.c $(MATHHDRS) bn_mp_rshd.o: $(TOMMATH_DIR)/bn_mp_rshd.c $(MATHHDRS) $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_rshd.c -bn_mp_set.o: $(TOMMATH_DIR)/bn_mp_set.c $(MATHHDRS) - $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_set.c - -bn_mp_set_l.o: $(TOMMATH_DIR)/bn_mp_set_l.c $(MATHHDRS) - $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_set_l.c +bn_mp_set_i64.o: $(TOMMATH_DIR)/bn_mp_set_i64.c $(MATHHDRS) + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_set_i64.c -bn_mp_set_ul.o: $(TOMMATH_DIR)/bn_mp_set_ul.c $(MATHHDRS) - $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_set_ul.c +bn_mp_set_u64.o: $(TOMMATH_DIR)/bn_mp_set_u64.c $(MATHHDRS) + $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_set_u64.c bn_mp_shrink.o: $(TOMMATH_DIR)/bn_mp_shrink.c $(MATHHDRS) $(CC) -c $(CC_SWITCHES) $(TOMMATH_DIR)/bn_mp_shrink.c @@ -2118,14 +2114,6 @@ gendate: # <y.tab.c >$(GENERIC_DIR)/tclDate.c # rm y.tab.c -# The following target generates the file generic/tclTomMath.h. It needs to be -# run (and the results checked) after updating to a new release of libtommath. - -gentommath_h: - $(NATIVE_TCLSH) "$(TOOL_DIR)/fix_tommath_h.tcl" \ - "$(TOMMATH_DIR)/tommath.h" \ - > "$(GENERIC_DIR)/tclTomMath.h" - # # Target to regenerate header files and stub files from the *.decls tables. # diff --git a/unix/configure b/unix/configure index 940bdd2..34ac4a7 100755 --- a/unix/configure +++ b/unix/configure @@ -706,6 +706,9 @@ TCL_LIBS LIBOBJS AR RANLIB +TOMMATH_INCLUDE +TOMMATH_SRCS +TOMMATH_OBJS ZLIB_INCLUDE ZLIB_SRCS ZLIB_OBJS @@ -770,6 +773,7 @@ enable_man_compression enable_man_suffix with_encoding enable_shared +with_system_libtommath enable_64bit enable_64bit_vis enable_rpath @@ -1440,6 +1444,9 @@ Optional Packages: --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-encoding encoding for configuration values (default: iso8859-1) + --with-system-libtommath + use external libtommath (default: true if available, + false otherwise) --with-tzdata install timezone data (default: autodetect) Some influential environment variables: @@ -2395,7 +2402,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu TCL_VERSION=9.0 TCL_MAJOR_VERSION=9 TCL_MINOR_VERSION=0 -TCL_PATCH_LEVEL="a1" +TCL_PATCH_LEVEL="a2" VERSION=${TCL_VERSION} EXTRA_INSTALL_BINARIES=${EXTRA_INSTALL_BINARIES:-"@:"} @@ -4657,6 +4664,98 @@ fi $as_echo "#define HAVE_ZLIB 1" >>confdefs.h +#------------------------------------------------------------------------ +# Add stuff for libtommath + +libtommath_ok=yes + +# Check whether --with-system-libtommath was given. +if test "${with_system_libtommath+set}" = set; then : + withval=$with_system_libtommath; libtommath_ok=${withval} +fi + +if test x"${libtommath_ok}" = x -o x"${libtommath_ok}" != xno; then + ac_fn_c_check_header_mongrel "$LINENO" "tommath.h" "ac_cv_header_tommath_h" "$ac_includes_default" +if test "x$ac_cv_header_tommath_h" = xyes; then : + + ac_fn_c_check_type "$LINENO" "mp_int" "ac_cv_type_mp_int" "#include <tommath.h> +" +if test "x$ac_cv_type_mp_int" = xyes; then : + +else + libtommath_ok=no +fi + +else + + libtommath_ok=no +fi + + + if test $libtommath_ok = yes; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mp_log_u32 in -ltommath" >&5 +$as_echo_n "checking for mp_log_u32 in -ltommath... " >&6; } +if ${ac_cv_lib_tommath_mp_log_u32+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ltommath $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char mp_log_u32 (); +int +main () +{ +return mp_log_u32 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_tommath_mp_log_u32=yes +else + ac_cv_lib_tommath_mp_log_u32=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tommath_mp_log_u32" >&5 +$as_echo "$ac_cv_lib_tommath_mp_log_u32" >&6; } +if test "x$ac_cv_lib_tommath_mp_log_u32" = xyes; then : + MATH_LIBS="$MATH_LIBS -ltommath" +else + + libtommath_ok=no +fi + +fi +fi +if test $libtommath_ok = yes; then : + + +$as_echo "#define TCL_WITH_EXTERNAL_TOMMATH 1" >>confdefs.h + + +else + + TOMMATH_OBJS=\${TOMMATH_OBJS} + + TOMMATH_SRCS=\${TOMMATH_SRCS} + + TOMMATH_INCLUDE=-I\${TOMMATH_DIR} + + +fi + #-------------------------------------------------------------------- # The statements below define a collection of compile flags. This # macro depends on the value of SHARED_BUILD, and should be called @@ -5742,7 +5841,6 @@ fi SHLIB_SUFFIX=".so" DL_OBJS="tclLoadDl.o" DL_LIBS="" - LDFLAGS="" if test $doRpath = yes; then : CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' @@ -5946,6 +6044,7 @@ fi $as_echo "#define MODULE_SCOPE __private_extern__" >>confdefs.h + tcl_cv_cc_visibility_hidden=yes fi CC_SEARCH_FLAGS="" @@ -6497,7 +6596,7 @@ fi if test "${SHARED_BUILD}" = 1 -a "${SHLIB_SUFFIX}" != ""; then : LIB_SUFFIX=${SHARED_LIB_SUFFIX} - MAKE_LIB='${SHLIB_LD} -o $@ ${OBJS} ${SHLIB_LD_LIBS} ${TCL_SHLIB_LD_EXTRAS} ${TK_SHLIB_LD_EXTRAS} ${LD_SEARCH_FLAGS}' + MAKE_LIB='${SHLIB_LD} -o $@ ${OBJS} ${LDFLAGS} ${SHLIB_LD_LIBS} ${TCL_SHLIB_LD_EXTRAS} ${TK_SHLIB_LD_EXTRAS} ${LD_SEARCH_FLAGS}' if test "${SHLIB_SUFFIX}" = ".dll"; then : INSTALL_LIB='$(INSTALL_LIBRARY) $(LIB_FILE) "$(BIN_INSTALL_DIR)/$(LIB_FILE)";if test -f $(LIB_FILE).a; then $(INSTALL_DATA) $(LIB_FILE).a "$(LIB_INSTALL_DIR)"; fi;' @@ -6908,9 +7007,6 @@ fi if test "${tcl_cv_type_64bit}" = none ; then -$as_echo "#define MP_32BIT 1" >>confdefs.h - - $as_echo "#define TCL_WIDE_INT_IS_LONG 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 diff --git a/unix/configure.ac b/unix/configure.ac index 85ab66e..996c78d 100644 --- a/unix/configure.ac +++ b/unix/configure.ac @@ -25,7 +25,7 @@ m4_ifdef([SC_USE_CONFIG_HEADERS], [ TCL_VERSION=9.0 TCL_MAJOR_VERSION=9 TCL_MINOR_VERSION=0 -TCL_PATCH_LEVEL="a1" +TCL_PATCH_LEVEL="a2" VERSION=${TCL_VERSION} EXTRA_INSTALL_BINARIES=${EXTRA_INSTALL_BINARIES:-"@:"} @@ -167,6 +167,30 @@ AS_IF([test $zlib_ok = no], [ ]) AC_DEFINE(HAVE_ZLIB, 1, [Is there an installed zlib?]) +#------------------------------------------------------------------------ +# Add stuff for libtommath + +libtommath_ok=yes +AC_ARG_WITH(system-libtommath, +AC_HELP_STRING([--with-system-libtommath], + [use external libtommath (default: true if available, false otherwise)]), + libtommath_ok=${withval}) +if test x"${libtommath_ok}" = x -o x"${libtommath_ok}" != xno; then + AC_CHECK_HEADER([tommath.h],[ + AC_CHECK_TYPE([mp_int],[],[libtommath_ok=no],[#include <tommath.h>])],[ + libtommath_ok=no]) + AS_IF([test $libtommath_ok = yes], [ + AC_CHECK_LIB([tommath],[mp_log_u32],[MATH_LIBS="$MATH_LIBS -ltommath"],[ + libtommath_ok=no])]) +fi +AS_IF([test $libtommath_ok = yes], [ + AC_DEFINE(TCL_WITH_EXTERNAL_TOMMATH, 1, [Tcl with external libtommath]) +], [ + AC_SUBST(TOMMATH_OBJS,[\${TOMMATH_OBJS}]) + AC_SUBST(TOMMATH_SRCS,[\${TOMMATH_SRCS}]) + AC_SUBST(TOMMATH_INCLUDE,[-I\${TOMMATH_DIR}]) +]) + #-------------------------------------------------------------------- # The statements below define a collection of compile flags. This # macro depends on the value of SHARED_BUILD, and should be called diff --git a/unix/tcl.m4 b/unix/tcl.m4 index 1984c7c..1c4653e 100644 --- a/unix/tcl.m4 +++ b/unix/tcl.m4 @@ -1385,7 +1385,6 @@ AC_DEFUN([SC_CONFIG_CFLAGS], [ SHLIB_SUFFIX=".so" DL_OBJS="tclLoadDl.o" DL_LIBS="" - LDFLAGS="" AS_IF([test $doRpath = yes], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) @@ -1476,6 +1475,7 @@ AC_DEFUN([SC_CONFIG_CFLAGS], [ AS_IF([test "$tcl_cv_cc_visibility_hidden" != yes], [ AC_DEFINE(MODULE_SCOPE, [__private_extern__], [Compiler support for module scope symbols]) + tcl_cv_cc_visibility_hidden=yes ]) CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" @@ -1821,7 +1821,7 @@ dnl # preprocessing tests use only CPPFLAGS. AS_IF([test "${SHARED_BUILD}" = 1 -a "${SHLIB_SUFFIX}" != ""], [ LIB_SUFFIX=${SHARED_LIB_SUFFIX} - MAKE_LIB='${SHLIB_LD} -o [$]@ ${OBJS} ${SHLIB_LD_LIBS} ${TCL_SHLIB_LD_EXTRAS} ${TK_SHLIB_LD_EXTRAS} ${LD_SEARCH_FLAGS}' + MAKE_LIB='${SHLIB_LD} -o [$]@ ${OBJS} ${LDFLAGS} ${SHLIB_LD_LIBS} ${TCL_SHLIB_LD_EXTRAS} ${TK_SHLIB_LD_EXTRAS} ${LD_SEARCH_FLAGS}' AS_IF([test "${SHLIB_SUFFIX}" = ".dll"], [ INSTALL_LIB='$(INSTALL_LIBRARY) $(LIB_FILE) "$(BIN_INSTALL_DIR)/$(LIB_FILE)";if test -f $(LIB_FILE).a; then $(INSTALL_DATA) $(LIB_FILE).a "$(LIB_INSTALL_DIR)"; fi;' DLL_INSTALL_DIR="\$(BIN_INSTALL_DIR)" @@ -2370,7 +2370,6 @@ AC_DEFUN([SC_TCL_EARLY_FLAGS],[ # HAVE_STRUCT_DIRENT64, HAVE_DIR64 # HAVE_STRUCT_STAT64 # HAVE_TYPE_OFF64_T -# MP_32BIT # #-------------------------------------------------------------------- @@ -2388,7 +2387,6 @@ AC_DEFUN([SC_TCL_64BIT_FLAGS], [ case 1: case (sizeof(]${tcl_type_64bit}[)==sizeof(long)): ; }],tcl_cv_type_64bit=${tcl_type_64bit})]) if test "${tcl_cv_type_64bit}" = none ; then - AC_DEFINE(MP_32BIT, 1, [Use 'MP_32BIT' for libtommath]) AC_DEFINE(TCL_WIDE_INT_IS_LONG, 1, [Do 'long' and 'long long' have the same size (64-bit)?]) AC_MSG_RESULT([yes]) else diff --git a/unix/tcl.pc.in b/unix/tcl.pc.in index ca932d2..a343707 100644 --- a/unix/tcl.pc.in +++ b/unix/tcl.pc.in @@ -11,7 +11,7 @@ Name: Tool Command Language Description: Tcl is a powerful, easy-to-learn dynamic programming language, suitable for a wide range of uses. URL: http://www.tcl.tk/ Version: @TCL_VERSION@@TCL_PATCH_LEVEL@ -Requires.private: zlib >= 1.2.3 +Requires.private: zlib >= 1.2.3, libtommath >= 1.2.0 Libs: -L${libdir} @TCL_LIB_FLAG@ @TCL_STUB_LIB_FLAG@ Libs.private: @TCL_LIBS@ Cflags: -I${includedir} diff --git a/unix/tclConfig.h.in b/unix/tclConfig.h.in index 574c920..fb29a32 100644 --- a/unix/tclConfig.h.in +++ b/unix/tclConfig.h.in @@ -307,12 +307,6 @@ /* No Compiler support for module scope symbols */ #undef MODULE_SCOPE -/* Use 'MP_32BIT' for libtommath */ -#undef MP_32BIT - -/* Default libtommath precision. */ -#undef MP_PREC - /* Is no debugging enabled? */ #undef NDEBUG diff --git a/unix/tclSelectNotfy.c b/unix/tclSelectNotfy.c index f9e99aa..62d77dd 100644 --- a/unix/tclSelectNotfy.c +++ b/unix/tclSelectNotfy.c @@ -233,6 +233,9 @@ typedef struct { const void *lpszClassName; } WNDCLASSW; +#ifdef __clang__ +#pragma clang diagnostic ignored "-Wignored-attributes" +#endif extern void __stdcall CloseHandle(void *); extern void *__stdcall CreateEventW(void *, unsigned char, unsigned char, void *); diff --git a/unix/tclUnixFCmd.c b/unix/tclUnixFCmd.c index 2cc6721..b32a2a2 100644 --- a/unix/tclUnixFCmd.c +++ b/unix/tclUnixFCmd.c @@ -2040,7 +2040,7 @@ TclpObjNormalizePath( } /* - * Call 'realpath' to obtain a canonical path. + * Call 'realpath' to obtain a canonical path. */ #ifndef NO_REALPATH @@ -2050,7 +2050,7 @@ TclpObjNormalizePath( * The path contains at most one component, e.g. '/foo' or '/', so * so there is nothing to resolve. Also, on some platforms * 'Realpath' transforms an empty string into the normalized pwd, - * which is the wrong answer. + * which is the wrong answer. */ return 0; @@ -2096,7 +2096,7 @@ TclpObjNormalizePath( if (path[nextCheckpoint] != '\0') { /* - * Append the remaining path components. + * Append the remaining path components. */ int normLen = Tcl_DStringLength(&ds); diff --git a/unix/tclUnixFile.c b/unix/tclUnixFile.c index 86005f7..944bec8 100644 --- a/unix/tclUnixFile.c +++ b/unix/tclUnixFile.c @@ -42,8 +42,8 @@ TclpFindExecutable( Tcl_Encoding encoding; #ifdef __CYGWIN__ size_t length; - char buf[PATH_MAX * 2]; - char name[PATH_MAX * TCL_UTF_MAX + 1]; + wchar_t buf[PATH_MAX]; + char name[PATH_MAX * 3 + 1]; GetModuleFileNameW(NULL, buf, PATH_MAX); cygwin_conv_path(3, buf, name, PATH_MAX); length = strlen(name); diff --git a/unix/tclUnixInit.c b/unix/tclUnixInit.c index eeb766e..2aa64bf 100644 --- a/unix/tclUnixInit.c +++ b/unix/tclUnixInit.c @@ -31,6 +31,9 @@ #endif #ifdef __CYGWIN__ +#ifdef __clang__ +#pragma clang diagnostic ignored "-Wignored-attributes" +#endif DLLIMPORT extern __stdcall unsigned char GetVersionExW(void *); DLLIMPORT extern __stdcall void *GetModuleHandleW(const void *); DLLIMPORT extern __stdcall void FreeLibrary(void *); diff --git a/unix/tclUnixPort.h b/unix/tclUnixPort.h index 527f662..adbb7aa 100644 --- a/unix/tclUnixPort.h +++ b/unix/tclUnixPort.h @@ -96,19 +96,26 @@ typedef off_t Tcl_SeekOffset; # define SOCKET unsigned int # define WSAEWOULDBLOCK 10035 typedef unsigned short WCHAR; - __declspec(dllimport) extern __stdcall int GetModuleHandleExW(unsigned int, const char *, void *); - __declspec(dllimport) extern __stdcall int GetModuleFileNameW(void *, const char *, int); +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wignored-attributes" +#endif + __declspec(dllimport) extern __stdcall int GetModuleHandleExW(unsigned int, const void *, void *); + __declspec(dllimport) extern __stdcall int GetModuleFileNameW(void *, const void *, int); __declspec(dllimport) extern __stdcall int WideCharToMultiByte(int, int, const void *, int, char *, int, const char *, void *); __declspec(dllimport) extern __stdcall int MultiByteToWideChar(int, int, const char *, int, WCHAR *, int); __declspec(dllimport) extern __stdcall void OutputDebugStringW(const WCHAR *); - __declspec(dllimport) extern __stdcall int IsDebuggerPresent(); - __declspec(dllimport) extern __stdcall int GetLastError(); + __declspec(dllimport) extern __stdcall int IsDebuggerPresent(void); + __declspec(dllimport) extern __stdcall int GetLastError(void); __declspec(dllimport) extern __stdcall int GetFileAttributesW(const WCHAR *); __declspec(dllimport) extern __stdcall int SetFileAttributesW(const WCHAR *, int); __declspec(dllimport) extern int cygwin_conv_path(int, const void *, void *, int); +#ifdef __clang__ +#pragma clang diagnostic pop +#endif /* On Cygwin, the environment is imported from the Cygwin DLL. */ #ifndef __x86_64__ # define environ __cygwin_environ @@ -155,6 +162,8 @@ typedef off_t Tcl_SeekOffset; #include <limits.h> #ifdef HAVE_STDINT_H # include <stdint.h> +#else +# include "../compat/stdint.h" #endif #include <unistd.h> diff --git a/unix/tclUnixThrd.c b/unix/tclUnixThrd.c index afb8b1c..7b1a4bb 100644 --- a/unix/tclUnixThrd.c +++ b/unix/tclUnixThrd.c @@ -258,9 +258,9 @@ TclpThreadCreate( } if (pthread_create(&theThread, &attr, - (void * (*)(void *)) proc, (void *) clientData) && + (void * (*)(void *))(void *)proc, (void *) clientData) && pthread_create(&theThread, NULL, - (void * (*)(void *)) proc, (void *) clientData)) { + (void * (*)(void *))(void *)proc, (void *) clientData)) { result = TCL_ERROR; } else { *idPtr = (Tcl_ThreadId) theThread; diff --git a/win/Makefile.in b/win/Makefile.in index 0c0308d..0a87fb4 100644 --- a/win/Makefile.in +++ b/win/Makefile.in @@ -99,11 +99,12 @@ SRC_DIR = @srcdir@ ROOT_DIR = @srcdir@/.. TOP_DIR = $(shell cd @srcdir@/..; pwd -W 2>/dev/null || pwd -P) GENERIC_DIR = $(TOP_DIR)/generic -TOMMATH_DIR = $(TOP_DIR)/libtommath WIN_DIR = $(TOP_DIR)/win COMPAT_DIR = $(TOP_DIR)/compat PKGS_DIR = $(TOP_DIR)/pkgs ZLIB_DIR = $(COMPAT_DIR)/zlib +MINIZIP_DIR = $(ZLIB_DIR)/contrib/minizip +TOMMATH_DIR = $(TOP_DIR)/libtommath # Converts a POSIX path to a Windows native path. CYGPATH = @CYGPATH@ @@ -114,15 +115,12 @@ includedir_native = $(shell $(CYGPATH) '$(includedir)') mandir_native = $(shell $(CYGPATH) '$(mandir)') TCL_LIBRARY_NATIVE = $(shell $(CYGPATH) '$(TCL_LIBRARY)') 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)') ROOT_DIR_WIN_NATIVE = $(shell cd '$(ROOT_DIR)' ; pwd -W 2>/dev/null || pwd -P) ZLIB_DIR_NATIVE = $(shell $(CYGPATH) '$(ZLIB_DIR)') -#GENERIC_DIR_NATIVE = $(GENERIC_DIR) -#TOMMATH_DIR_NATIVE = $(TOMMATH_DIR) -#WIN_DIR_NATIVE = $(WIN_DIR) -#ROOT_DIR_NATIVE = $(ROOT_DIR) +MINIZIP_DIR_NATIVE = $(shell $(CYGPATH) '$(MINIZIP_DIR)') +TOMMATH_DIR_NATIVE = $(shell $(CYGPATH) '$(TOMMATH_DIR)') # Fully qualify library path so that `make test` # does not depend on the current directory. @@ -160,8 +158,9 @@ TEST_LOAD_PRMS = lappend ::auto_path {$(ROOT_DIR_WIN_NATIVE)/tests};\ TEST_LOAD_FACILITIES = package ifneeded Tcltest ${VERSION}@TCL_PATCH_LEVEL@ [list load [file normalize ${TEST_DLL_FILE}] Tcltest];\ $(TEST_LOAD_PRMS) ZLIB_DLL_FILE = zlib1.dll +TOMMATH_DLL_FILE = libtommath.dll -SHARED_LIBRARIES = $(TCL_DLL_FILE) @ZLIB_DLL_FILE@ +SHARED_LIBRARIES = $(TCL_DLL_FILE) @ZLIB_DLL_FILE@ @TOMMATH_DLL_FILE@ STATIC_LIBRARIES = $(TCL_LIB_FILE) TCLSH = tclsh$(VER)${EXESUFFIX} @@ -181,7 +180,7 @@ TCL_EXE = @TCL_EXE@ # Setting the VPATH variable to a list of paths will cause the Makefile to # look into these paths when resolving .c to .obj dependencies. -VPATH = $(GENERIC_DIR):$(TOMMATH_DIR):$(WIN_DIR):$(COMPAT_DIR):$(ZLIB_DIR) +VPATH = $(GENERIC_DIR):$(WIN_DIR):$(COMPAT_DIR):$(ZLIB_DIR):$(TOMMATH_DIR) AR = @AR@ RANLIB = @RANLIB@ @@ -202,7 +201,7 @@ SHLIB_LD = @SHLIB_LD@ SHLIB_LD_LIBS = @SHLIB_LD_LIBS@ SHLIB_CFLAGS = @SHLIB_CFLAGS@ SHLIB_SUFFIX = @SHLIB_SUFFIX@ -LIBS = @LIBS@ $(shell $(CYGPATH) '@ZLIB_LIBS@') +LIBS = @LIBS@ $(shell $(CYGPATH) '@ZLIB_LIBS@') $(shell $(CYGPATH) '@TOMMATH_LIBS@') RMDIR = rm -rf MKDIR = mkdir -p @@ -250,16 +249,16 @@ MINIZIP_OBJS = \ ZIP_INSTALL_OBJS = @ZIP_INSTALL_OBJS@ -CC_SWITCHES = ${CFLAGS} ${CFLAGS_WARNING} ${TCL_SHLIB_CFLAGS} \ --I"${ZLIB_DIR_NATIVE}" -I"${GENERIC_DIR_NATIVE}" \ --DMP_PREC=4 -I"${TOMMATH_DIR_NATIVE}" -I"${WIN_DIR_NATIVE}" \ +CC_SWITCHES = -I"${GENERIC_DIR_NATIVE}" -I"${TOMMATH_DIR_NATIVE}" \ +-I"${ZLIB_DIR_NATIVE}" -I"${WIN_DIR_NATIVE}" \ +${CFLAGS} ${CFLAGS_WARNING} ${TCL_SHLIB_CFLAGS} -DMP_PREC=4 \ ${AC_FLAGS} ${COMPILE_DEBUG_FLAGS} ${NO_DEPRECATED_FLAGS} CC_OBJNAME = @CC_OBJNAME@ CC_EXENAME = @CC_EXENAME@ STUB_CC_SWITCHES = ${CFLAGS} ${CFLAGS_WARNING} ${SHLIB_CFLAGS} \ --I"${GENERIC_DIR_NATIVE}" -DMP_PREC=4 -I"${TOMMATH_DIR_NATIVE}" \ +-I"${GENERIC_DIR_NATIVE}" -I"${TOMMATH_DIR_NATIVE}" \ -I"${WIN_DIR_NATIVE}" ${AC_FLAGS} \ ${COMPILE_DEBUG_FLAGS} @@ -380,17 +379,15 @@ TOMMATH_OBJS = \ bn_mp_div_3.${OBJEXT} \ bn_mp_exch.${OBJEXT} \ bn_mp_expt_u32.${OBJEXT} \ - bn_mp_get_mag_ul.${OBJEXT} \ + bn_mp_get_mag_u64.${OBJEXT} \ bn_mp_grow.${OBJEXT} \ bn_mp_init.${OBJEXT} \ bn_mp_init_copy.${OBJEXT} \ - bn_mp_init_l.${OBJEXT} \ - bn_mp_init_ll.${OBJEXT} \ + bn_mp_init_i64.${OBJEXT} \ bn_mp_init_multi.${OBJEXT} \ bn_mp_init_set.${OBJEXT} \ bn_mp_init_size.${OBJEXT} \ - bn_mp_init_ul.${OBJEXT} \ - bn_mp_init_ull.${OBJEXT} \ + bn_mp_init_u64.${OBJEXT} \ bn_mp_lshd.${OBJEXT} \ bn_mp_mod.${OBJEXT} \ bn_mp_mod_2d.${OBJEXT} \ @@ -404,9 +401,8 @@ TOMMATH_OBJS = \ bn_mp_radix_smap.${OBJEXT} \ bn_mp_read_radix.${OBJEXT} \ bn_mp_rshd.${OBJEXT} \ - bn_mp_set.${OBJEXT} \ - bn_mp_set_l.${OBJEXT} \ - bn_mp_set_ul.${OBJEXT} \ + bn_mp_set_i64.${OBJEXT} \ + bn_mp_set_u64.${OBJEXT} \ bn_mp_shrink.${OBJEXT} \ bn_mp_sqr.${OBJEXT} \ bn_mp_sqrt.${OBJEXT} \ @@ -477,7 +473,7 @@ ZLIB_OBJS = \ uncompr.$(OBJEXT) \ zutil.$(OBJEXT) -TCL_OBJS = ${GENERIC_OBJS} $(TOMMATH_OBJS) ${WIN_OBJS} @ZLIB_OBJS@ +TCL_OBJS = ${GENERIC_OBJS} ${WIN_OBJS} @ZLIB_OBJS@ @TOMMATH_OBJS@ TCL_DOCS = "$(ROOT_DIR_NATIVE)"/doc/*.[13n] @@ -570,7 +566,7 @@ ${TCL_STUB_LIB_FILE}: ${STUB_OBJS} @MAKE_STUB_LIB@ ${STUB_OBJS} @POST_MAKE_LIB@ -${TCL_DLL_FILE}: ${TCL_OBJS} tcl.$(RES) @ZLIB_DLL_FILE@ ${TCL_ZIP_FILE} +${TCL_DLL_FILE}: ${TCL_OBJS} tcl.$(RES) @ZLIB_DLL_FILE@ @TOMMATH_DLL_FILE@ ${TCL_ZIP_FILE} @$(RM) ${TCL_DLL_FILE} $(TCL_LIB_FILE) @MAKE_DLL@ ${TCL_OBJS} tcl.$(RES) $(SHLIB_LD_LIBS) $(COPY) tclsh.exe.manifest ${TCL_DLL_FILE}.manifest @@ -613,6 +609,14 @@ ${ZLIB_DLL_FILE}: ${TCL_STUB_LIB_FILE} $(COPY) $(ZLIB_DIR)/win32/${ZLIB_DLL_FILE} ${ZLIB_DLL_FILE}; \ fi; +# use pre-built libtommath.dll +${TOMMATH_DLL_FILE}: ${TCL_STUB_LIB_FILE} + @if test "@TOMMATH_LIBS@set" != "${TOMMATH_DIR_NATIVE}/win32/tommath.libset" ; then \ + $(COPY) $(TOMMATH_DIR)/win64/${TOMMATH_DLL_FILE} ${TOMMATH_DLL_FILE}; \ + else \ + $(COPY) $(TOMMATH_DIR)/win32/${TOMMATH_DLL_FILE} ${TOMMATH_DLL_FILE}; \ + fi; + # Add the object extension to the implicit rules. By default .obj is not # automatically added. @@ -651,7 +655,7 @@ tclZipfs.${OBJEXT}: $(GENERIC_DIR)/tclZipfs.c -DCFG_RUNTIME_ZIPFILE="\"$(TCL_ZIP_FILE)\"" \ -DCFG_RUNTIME_LIBDIR="\"$(bindir_native)\"" \ -DCFG_RUNTIME_SCRDIR="\"$(TCL_LIBRARY_NATIVE)\"" \ - $(ZLIB_INCLUDE) -I$(ZLIB_DIR)/contrib/minizip @DEPARG@ $(CC_OBJNAME) + $(ZLIB_INCLUDE) -I$(MINIZIP_DIR_NATIVE) @DEPARG@ $(CC_OBJNAME) # TIP #59, embedding of configuration information into the binary library. @@ -780,14 +784,6 @@ gendate: --no-lines \ $(GENERIC_DIR)/tclGetDate.y -# The following target generates the file generic/tclTomMath.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)/tclTomMath.h" - INSTALL_BASE_TARGETS = install-binaries $(INSTALL_LIBRARIES) $(INSTALL_MSGS) $(INSTALL_TZDATA) INSTALL_DOC_TARGETS = install-doc INSTALL_PACKAGE_TARGETS = install-packages @@ -816,7 +812,7 @@ install-binaries: binaries else true; \ fi; \ done; - @for i in $(TCL_DLL_FILE) $(ZLIB_DLL_FILE) $(TCLSH); \ + @for i in $(TCL_DLL_FILE) $(ZLIB_DLL_FILE) $(TOMMATH_DLL_FILE) $(TCLSH); \ do \ if [ -f $$i ]; then \ echo "Installing $$i to $(BIN_INSTALL_DIR)/"; \ @@ -893,8 +889,8 @@ install-libraries: libraries install-tzdata install-msgs done; @echo "Installing package msgcat 1.7.0 as a Tcl Module"; @$(COPY) $(ROOT_DIR)/library/msgcat/msgcat.tcl $(SCRIPT_INSTALL_DIR)/../tcl9/9.0/msgcat-1.7.0.tm; - @echo "Installing package tcltest 2.5.1 as a Tcl Module"; - @$(COPY) $(ROOT_DIR)/library/tcltest/tcltest.tcl $(SCRIPT_INSTALL_DIR)/../tcl9/9.0/tcltest-2.5.1.tm; + @echo "Installing package tcltest 2.5.2 as a Tcl Module"; + @$(COPY) $(ROOT_DIR)/library/tcltest/tcltest.tcl $(SCRIPT_INSTALL_DIR)/../tcl9/9.0/tcltest-2.5.2.tm; @echo "Installing package platform 1.0.14 as a Tcl Module"; @$(COPY) $(ROOT_DIR)/library/platform/platform.tcl $(SCRIPT_INSTALL_DIR)/../tcl9/9.0/platform-1.0.14.tm; @echo "Installing package platform::shell 1.1.4 as a Tcl Module"; @@ -931,7 +927,8 @@ install-headers: $(GENERIC_DIR)/tclOO.h $(GENERIC_DIR)/tclOODecls.h \ $(GENERIC_DIR)/tclPlatDecls.h \ $(GENERIC_DIR)/tclTomMath.h \ - $(GENERIC_DIR)/tclTomMathDecls.h ; \ + $(GENERIC_DIR)/tclTomMathDecls.h \ + $(TOMMATH_DIR)/tommath.h ; \ do \ $(COPY) $$i "$(INCLUDE_INSTALL_DIR)"; \ done; diff --git a/win/configure b/win/configure index 92cd49a..1760fad 100755 --- a/win/configure +++ b/win/configure @@ -710,8 +710,11 @@ ZIP_PROG TCLSH_PROG EXEEXT_FOR_BUILD CC_FOR_BUILD +TOMMATH_OBJS ZLIB_OBJS +TOMMATH_LIBS ZLIB_LIBS +TOMMATH_DLL_FILE ZLIB_DLL_FILE CFLAGS_WARNING CFLAGS_OPTIMIZE @@ -2163,7 +2166,7 @@ SHELL=/bin/sh TCL_VERSION=9.0 TCL_MAJOR_VERSION=9 TCL_MINOR_VERSION=0 -TCL_PATCH_LEVEL="a1" +TCL_PATCH_LEVEL="a2" VER=$TCL_MAJOR_VERSION$TCL_MINOR_VERSION TCL_DDE_VERSION=1.4 @@ -3964,14 +3967,14 @@ $as_echo "$ac_cv_cross" >&6; } if test "$ac_cv_cross" = "yes"; then case "$do64bit" in amd64|x64|yes) - CC="x86_64-w64-mingw32-gcc" + CC="x86_64-w64-mingw32-${CC}" LD="x86_64-w64-mingw32-ld" AR="x86_64-w64-mingw32-ar" RANLIB="x86_64-w64-mingw32-ranlib" RC="x86_64-w64-mingw32-windres" ;; *) - CC="i686-w64-mingw32-gcc" + CC="i686-w64-mingw32-${CC}" LD="i686-w64-mingw32-ld" AR="i686-w64-mingw32-ar" RANLIB="i686-w64-mingw32-ranlib" @@ -4205,10 +4208,19 @@ $as_echo "using shared flags" >&6; } CFLAGS_DEBUG=-g CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" - CFLAGS_WARNING="-Wall -Wwrite-strings -Wsign-compare -Wdeclaration-after-statement -Wpointer-arith" + CFLAGS_WARNING="-Wall -Wwrite-strings -Wsign-compare -Wpointer-arith" LDFLAGS_DEBUG= LDFLAGS_OPTIMIZE= + case "${CC}" in + *++) + CFLAGS_WARNING="${CFLAGS_WARNING} -Wno-format" + ;; + *) + CFLAGS_WARNING="${CFLAGS_WARNING} -Wdeclaration-after-statement" + ;; + esac + # Specify the CC output file names based on the target name CC_OBJNAME="-o \$@" CC_EXENAME="-o \$@" @@ -4577,10 +4589,6 @@ $as_echo "#define HAVE_CAST_TO_UNION 1" >>confdefs.h fi fi - -$as_echo "#define MP_32BIT 1" >>confdefs.h - - # DL_LIBS is empty, but then we match the Unix version @@ -4599,8 +4607,9 @@ case ${host_alias} in esac #------------------------------------------------------------------------ -# Add stuff for zlib; note that this is mostly done in the makefile now -# as we just assume that the platform hasn't got a usable z.lib +# Add stuff for zlib/libtommath; note that this is mostly done in the +# makefile now as we just assume that the platform hasn't got usable +# z.lib/tommath.lib #------------------------------------------------------------------------ if test "${enable_shared+set}" = "set"; then : @@ -4617,17 +4626,29 @@ if test "$tcl_ok" = "yes"; then : ZLIB_DLL_FILE=\${ZLIB_DLL_FILE} + TOMMATH_DLL_FILE=\${TOMMATH_DLL_FILE} + + +$as_echo "#define TCL_WITH_EXTERNAL_TOMMATH 1" >>confdefs.h + if test "$do64bit" != "no"; then : + +$as_echo "#define MP_64BIT 1" >>confdefs.h + if test "$GCC" == "yes"; then : ZLIB_LIBS=\${ZLIB_DIR_NATIVE}/win64/libz.dll.a + TOMMATH_LIBS=\${TOMMATH_DIR_NATIVE}/win64/libtommath.dll.a + else ZLIB_LIBS=\${ZLIB_DIR_NATIVE}/win64/zdll.lib + TOMMATH_LIBS=\${TOMMATH_DIR_NATIVE}/win64/tommath.lib + fi @@ -4635,6 +4656,8 @@ else ZLIB_LIBS=\${ZLIB_DIR_NATIVE}/win32/zdll.lib + TOMMATH_LIBS=\${TOMMATH_DIR_NATIVE}/win32/tommath.lib + fi @@ -4642,6 +4665,8 @@ else ZLIB_OBJS=\${ZLIB_OBJS} + TOMMATH_OBJS=\${TOMMATH_OBJS} + fi diff --git a/win/configure.ac b/win/configure.ac index 9901f64..09929de 100644 --- a/win/configure.ac +++ b/win/configure.ac @@ -14,7 +14,7 @@ SHELL=/bin/sh TCL_VERSION=9.0 TCL_MAJOR_VERSION=9 TCL_MINOR_VERSION=0 -TCL_PATCH_LEVEL="a1" +TCL_PATCH_LEVEL="a2" VER=$TCL_MAJOR_VERSION$TCL_MINOR_VERSION TCL_DDE_VERSION=1.4 @@ -110,8 +110,9 @@ case ${host_alias} in esac #------------------------------------------------------------------------ -# Add stuff for zlib; note that this is mostly done in the makefile now -# as we just assume that the platform hasn't got a usable z.lib +# Add stuff for zlib/libtommath; note that this is mostly done in the +# makefile now as we just assume that the platform hasn't got usable +# z.lib/tommath.lib #------------------------------------------------------------------------ AS_IF([test "${enable_shared+set}" = "set"], [ @@ -122,17 +123,24 @@ AS_IF([test "${enable_shared+set}" = "set"], [ ]) AS_IF([test "$tcl_ok" = "yes"], [ AC_SUBST(ZLIB_DLL_FILE,[\${ZLIB_DLL_FILE}]) + AC_SUBST(TOMMATH_DLL_FILE,[\${TOMMATH_DLL_FILE}]) + AC_DEFINE(TCL_WITH_EXTERNAL_TOMMATH, 1, [Tcl with external libtommath]) AS_IF([test "$do64bit" != "no"], [ + AC_DEFINE(MP_64BIT, 1, [Using libtommath.dll in 64-bit mode]) AS_IF([test "$GCC" == "yes"],[ AC_SUBST(ZLIB_LIBS,[\${ZLIB_DIR_NATIVE}/win64/libz.dll.a]) + AC_SUBST(TOMMATH_LIBS,[\${TOMMATH_DIR_NATIVE}/win64/libtommath.dll.a]) ], [ AC_SUBST(ZLIB_LIBS,[\${ZLIB_DIR_NATIVE}/win64/zdll.lib]) + AC_SUBST(TOMMATH_LIBS,[\${TOMMATH_DIR_NATIVE}/win64/tommath.lib]) ]) ], [ AC_SUBST(ZLIB_LIBS,[\${ZLIB_DIR_NATIVE}/win32/zdll.lib]) + AC_SUBST(TOMMATH_LIBS,[\${TOMMATH_DIR_NATIVE}/win32/tommath.lib]) ]) ], [ AC_SUBST(ZLIB_OBJS,[\${ZLIB_OBJS}]) + AC_SUBST(TOMMATH_OBJS,[\${TOMMATH_OBJS}]) ]) AC_DEFINE(HAVE_ZLIB, 1, [Is there an installed zlib?]) diff --git a/win/makefile.vc b/win/makefile.vc index be8477d..f6b7b11 100644 --- a/win/makefile.vc +++ b/win/makefile.vc @@ -52,28 +52,30 @@ # turn on the 64-bit compiler, if your SDK has it.
#
# Basic macros and options usable on the commandline (see rules.vc for more info):
-# OPTS=msvcrt,static,staticpkg,symbols,profile,unchecked,utfmax,none
+# OPTS=msvcrt,nothreads,pdbs,profile,static,staticpkg,symbols,thrdalloc,unchecked,utfmax,none
# Sets special options for the core. The default is for none.
# Any combination of the above may be used (comma separated).
# 'none' will over-ride everything to nothing.
#
-# msvcrt = Affects the static option only to switch it from
-# using libcmt(d) as the C runtime [by default] to
-# msvcrt(d). This is useful for static embedding
-# support.
-# static = Builds a static library of the core instead of a
-# dll. The shell will be static (and large), as well.
-# staticpkg= Affects the static option only to switch
-# tclshXX.exe to have the dde and reg extension linked
-# inside it.
+# msvcrt = Affects the static option only to switch it from
+# using libcmt(d) as the C runtime [by default] to
+# msvcrt(d). This is useful for static embedding
+# support.
+# nothreads = Turns off full multithreading support (default on).
+# pbds = Produce separate debug symbol files.
+# profile = Adds profiling hooks. Map file is assumed.
+# static = Builds a static library of the core instead of a
+# dll. The shell will be static (and large), as well.
+# staticpkg = Affects the static option only to switch
+# tclshXX.exe to have the dde and reg extension linked
+# inside it.
+# symbols = Adds symbols for step debugging.
# thrdalloc = Use the thread allocator (shared global free pool).
-# symbols = Adds symbols for step debugging.
-# profile = Adds profiling hooks. Map file is assumed.
# unchecked = Allows a symbols build to not use the debug
-# enabled runtime (msvcrt.dll not msvcrtd.dll
-# or libcmt.lib not libcmtd.lib).
-# utfmax = Forces Tcl_UniChar to be a 32-bit quantity in stead
-# of 16-bits
+# enabled runtime (msvcrt.dll not msvcrtd.dll
+# or libcmt.lib not libcmtd.lib).
+# utfmax = Forces a build allowing 4-byte UTF-8 sequences
+# internally.
#
# STATS=compdbg,memdbg,none
# Sets optional memory and bytecode compiler debugging code added
@@ -214,6 +216,7 @@ TCLTESTOBJS = \ $(TMP_DIR)\tclWinReg.obj \
$(TMP_DIR)\tclWinDde.obj \
!endif
+ $(OUT_DIR)\tommath.lib \
!endif
$(TMP_DIR)\testMain.obj
@@ -307,6 +310,7 @@ COREOBJS = \ $(TMP_DIR)\tclZipfs.obj \
$(TMP_DIR)\tclZlib.obj
+!if $(STATIC_BUILD)
ZLIBOBJS = \
$(TMP_DIR)\adler32.obj \
$(TMP_DIR)\compress.obj \
@@ -319,7 +323,11 @@ ZLIBOBJS = \ $(TMP_DIR)\trees.obj \
$(TMP_DIR)\uncompr.obj \
$(TMP_DIR)\zutil.obj
+!else
+ZLIBOBJS = $(OUT_DIR)\zdll.lib
+!endif
+!if $(STATIC_BUILD)
TOMMATHOBJS = \
$(TMP_DIR)\bn_mp_add.obj \
$(TMP_DIR)\bn_mp_add_d.obj \
@@ -340,17 +348,15 @@ TOMMATHOBJS = \ $(TMP_DIR)\bn_mp_div_3.obj \
$(TMP_DIR)\bn_mp_exch.obj \
$(TMP_DIR)\bn_mp_expt_u32.obj \
- $(TMP_DIR)\bn_mp_get_mag_ul.obj \
+ $(TMP_DIR)\bn_mp_get_mag_u64.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_l.obj \
- $(TMP_DIR)\bn_mp_init_ll.obj \
+ $(TMP_DIR)\bn_mp_init_i64.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_init_ul.obj \
- $(TMP_DIR)\bn_mp_init_ull.obj \
+ $(TMP_DIR)\bn_mp_init_u64.obj \
$(TMP_DIR)\bn_mp_lshd.obj \
$(TMP_DIR)\bn_mp_mod.obj \
$(TMP_DIR)\bn_mp_mod_2d.obj \
@@ -364,9 +370,8 @@ TOMMATHOBJS = \ $(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_set_l.obj \
- $(TMP_DIR)\bn_mp_set_ul.obj \
+ $(TMP_DIR)\bn_mp_set_i64.obj \
+ $(TMP_DIR)\bn_mp_set_u64.obj \
$(TMP_DIR)\bn_mp_shrink.obj \
$(TMP_DIR)\bn_mp_sqr.obj \
$(TMP_DIR)\bn_mp_sqrt.obj \
@@ -390,6 +395,9 @@ TOMMATHOBJS = \ $(TMP_DIR)\bn_s_mp_sub.obj \
$(TMP_DIR)\bn_s_mp_toom_sqr.obj \
$(TMP_DIR)\bn_s_mp_toom_mul.obj
+!else
+TOMMATHOBJS = $(OUT_DIR)\tommath.lib
+!endif
PLATFORMOBJS = \
$(TMP_DIR)\tclWin32Dll.obj \
@@ -454,7 +462,7 @@ TESTFLAGS = $(TESTFLAGS) -file $(TESTPAT) release: setup $(TCLSH) $(TCLSTUBLIB) dlls pkgs
core: setup $(TCLLIB) $(TCLSTUBLIB)
shell: setup $(TCLSH)
-dlls: setup $(TCLREGLIB) $(TCLDDELIB)
+dlls: setup $(TCLREGLIB) $(TCLDDELIB) $(OUT_DIR)\zlib1.dll $(OUT_DIR)\libtommath.dll
all: setup $(TCLSH) $(TCLSTUBLIB) dlls pkgs
tcltest: setup $(TCLTEST) dlls
install: install-binaries install-libraries install-docs install-pkgs
@@ -527,6 +535,27 @@ $(TCLREGLIB): $(TMP_DIR)\tclWinReg.obj $(TCLSTUBLIB) $(_VC_MANIFEST_EMBED_DLL)
!endif
+!if "$(MACHINE)" == "AMD64"
+$(OUT_DIR)\zlib1.dll: $(COMPATDIR)\zlib\win64\zlib1.dll
+ $(COPY) $(COMPATDIR)\zlib\win64\zlib1.dll $(OUT_DIR)\zlib1.dll
+$(OUT_DIR)\zdll.lib: $(COMPATDIR)\zlib\win64\zdll.lib
+ $(COPY) $(COMPATDIR)\zlib\win64\zdll.lib $(OUT_DIR)\zdll.lib
+$(OUT_DIR)\libtommath.dll: $(TOMMATHDIR)\win64\libtommath.dll
+ $(COPY) $(TOMMATHDIR)\win64\libtommath.dll $(OUT_DIR)\libtommath.dll
+$(OUT_DIR)\tommath.lib: $(TOMMATHDIR)\win64\tommath.lib
+ $(COPY) $(TOMMATHDIR)\win64\tommath.lib $(OUT_DIR)\tommath.lib
+!else
+$(OUT_DIR)\zlib1.dll: $(COMPATDIR)\zlib\win32\zlib1.dll
+ $(COPY) $(COMPATDIR)\zlib\win32\zlib1.dll $(OUT_DIR)\zlib1.dll
+$(OUT_DIR)\zdll.lib: $(COMPATDIR)\zlib\win32\zdll.lib
+ $(COPY) $(COMPATDIR)\zlib\win32\zdll.lib $(OUT_DIR)\zdll.lib
+$(OUT_DIR)\libtommath.dll: $(TOMMATHDIR)\win32\libtommath.dll
+ $(COPY) $(TOMMATHDIR)\win32\libtommath.dll $(OUT_DIR)\libtommath.dll
+$(OUT_DIR)\tommath.lib: $(TOMMATHDIR)\win32\tommath.lib
+ $(COPY) $(TOMMATHDIR)\win32\tommath.lib $(OUT_DIR)\tommath.lib
+!endif
+
+
pkgs:
@for /d %d in ($(PKGSDIR)\*) do \
@if exist "%~fd\win\makefile.vc" ( \
@@ -575,21 +604,6 @@ genstubs: !endif
-#----------------------------------------------------------------------
-# The following target generates the file generic/tclTomMath.h.
-# It needs to be run (and the results checked) after updating
-# to a new release of libtommath.
-#----------------------------------------------------------------------
-
-gentommath_h:
-!if !exist($(TCLSH))
- @echo Build tclsh first!
-!else
- $(TCLSH) "$(TOOLSDIR:\=/)/fix_tommath_h.tcl" \
- "$(TOMMATHDIR:\=/)/tommath.h" \
- > "$(GENERICDIR)\tclTomMath.h"
-!endif
-
#---------------------------------------------------------------------
# Build the Windows HTML help file.
#---------------------------------------------------------------------
@@ -738,7 +752,7 @@ gendate: #---------------------------------------------------------------------
$(TMP_DIR)\testMain.obj: $(WIN_DIR)\tclAppInit.c
- $(cc32) $(appcflags) /DTCL_TEST /DUNICODE /D_UNICODE /DUSE_TCL_STUBS \
+ $(cc32) $(appcflags) /DTCL_TEST /DUNICODE /D_UNICODE \
/DTCL_USE_STATIC_PACKAGES=$(TCL_USE_STATIC_PACKAGES) \
-Fo$@ $?
@@ -785,11 +799,11 @@ $(TMP_DIR)\tclAppInit.obj: $(WIN_DIR)\tclAppInit.c ### The following objects should be built using the stub interfaces
$(TMP_DIR)\tclWinReg.obj: $(WIN_DIR)\tclWinReg.c
- $(cc32) $(appcflags) /DUSE_TCL_STUBS -Fo$@ $?
+ $(cc32) $(appcflags_nostubs) /DUSE_TCL_STUBS=1 -Fo$@ $?
$(TMP_DIR)\tclWinDde.obj: $(WIN_DIR)\tclWinDde.c
- $(cc32) $(appcflags) /DUSE_TCL_STUBS -Fo$@ $?
+ $(cc32) $(appcflags_nostubs) /DUSE_TCL_STUBS=1 -Fo$@ $?
### The following objects are part of the stub library and should not
@@ -891,6 +905,8 @@ install-binaries: @$(CPY) "$(TCLLIB)" "$(BIN_INSTALL_DIR)\"
!endif
@$(CPY) "$(TCLIMPLIB)" "$(LIB_INSTALL_DIR)\"
+ @$(CPY) "$(OUT_DIR)\zlib1.dll" "$(BIN_INSTALL_DIR)\"
+ @$(CPY) "$(OUT_DIR)\libtommath.dll" "$(BIN_INSTALL_DIR)\"
!if exist($(TCLSH))
@echo Installing $(TCLSHNAME)
@$(CPY) "$(TCLSH)" "$(BIN_INSTALL_DIR)\"
@@ -919,6 +935,7 @@ install-libraries: tclConfig tcl-nmake install-msgs install-tzdata @$(CPY) "$(GENERICDIR)\tclPlatDecls.h" "$(INCLUDE_INSTALL_DIR)\"
@$(CPY) "$(GENERICDIR)\tclTomMath.h" "$(INCLUDE_INSTALL_DIR)\"
@$(CPY) "$(GENERICDIR)\tclTomMathDecls.h" "$(INCLUDE_INSTALL_DIR)\"
+ @$(CPY) "$(TOMMATHDIR)\tommath.h" "$(INCLUDE_INSTALL_DIR)\"
@echo Installing library files to $(SCRIPT_INSTALL_DIR)
@$(CPY) "$(ROOT)\library\history.tcl" "$(SCRIPT_INSTALL_DIR)\"
@$(CPY) "$(ROOT)\library\init.tcl" "$(SCRIPT_INSTALL_DIR)\"
diff --git a/win/rules.vc b/win/rules.vc index 33d80b7..d0297a1 100644 --- a/win/rules.vc +++ b/win/rules.vc @@ -744,6 +744,15 @@ TCL_USE_STATIC_PACKAGES = 1 TCL_USE_STATIC_PACKAGES = 0
!endif
+!if [nmakehlp -f $(OPTS) "nothreads"]
+!message *** Compile explicitly for non-threaded tcl
+TCL_THREADS = 0
+USE_THREAD_ALLOC= 0
+!else
+TCL_THREADS = 1
+USE_THREAD_ALLOC= 1
+!endif
+
!if [nmakehlp -f $(OPTS) "utfmax"]
!message *** Force 32-bit Tcl_UniChar
TCL_UTF_MAX = 6
@@ -786,6 +795,12 @@ PGO = 0 !message *** Warning: ignoring option "loimpact" - deprecated on modern Windows.
!endif
+# TBD - should get rid of this option
+!if [nmakehlp -f $(OPTS) "thrdalloc"]
+!message *** Doing thrdalloc
+USE_THREAD_ALLOC = 1
+!endif
+
!if [nmakehlp -f $(OPTS) "tclalloc"]
USE_THREAD_ALLOC = 0
!endif
@@ -1196,8 +1211,8 @@ tklibs = "$(TKSTUBLIB)" "$(TKIMPLIB)" !endif # $(DOING_TK) || $(NEED_TK)
# Various output paths
-PRJIMPLIB = $(OUT_DIR)\$(PROJECT)$(VERSION)$(SUFX:t=).lib
-PRJLIBNAME = $(PROJECT)$(VERSION)$(SUFX:t=).$(EXT)
+PRJIMPLIB = $(OUT_DIR)\$(PROJECT)$(VERSION)$(SUFX).lib
+PRJLIBNAME = $(PROJECT)$(VERSION)$(SUFX).$(EXT)
PRJLIB = $(OUT_DIR)\$(PRJLIBNAME)
PRJSTUBLIBNAME = $(STUBPREFIX)$(VERSION).lib
@@ -1301,6 +1316,11 @@ OPTDEFINES = $(OPTDEFINES) /DUSE_THREAD_ALLOC=1 !endif
!if $(STATIC_BUILD)
OPTDEFINES = $(OPTDEFINES) /DSTATIC_BUILD
+!elseif $(TCL_VERSION) > 86
+OPTDEFINES = $(OPTDEFINES) /DTCL_WITH_EXTERNAL_TOMMATH
+!if "$(MACHINE)" == "AMD64"
+OPTDEFINES = $(OPTDEFINES) /DMP_64BIT
+!endif
!endif
!if $(TCL_NO_DEPRECATED)
OPTDEFINES = $(OPTDEFINES) /DTCL_NO_DEPRECATED
@@ -1310,7 +1330,7 @@ OPTDEFINES = $(OPTDEFINES) /DTCL_NO_DEPRECATED # Note we do not define USE_TCL_STUBS even when building tk since some
# test targets in tk do not use stubs
!if ! $(DOING_TCL)
-USE_STUBS_DEFS = /DUSE_TCL_STUBS /DUSE_TCLOO_STUBS
+USE_STUBS_DEFS = /DUSE_TCL_STUBS=1 /DUSE_TCLOO_STUBS=1
!if $(NEED_TK)
USE_STUBS_DEFS = $(USE_STUBS_DEFS) /DUSE_TK_STUBS
!endif
@@ -1330,7 +1350,7 @@ OPTDEFINES = $(OPTDEFINES) /DTCL_CFG_PROFILED OPTDEFINES = $(OPTDEFINES) /DTCL_CFG_DO64BIT
!endif
!if $(VCVERSION) < 1300
-OPTDEFINES = $(OPTDEFINES) /DNO_STRTOI64
+OPTDEFINES = $(OPTDEFINES) /DNO_STRTOI64=1
!endif
!if "$(TCL_UTF_MAX)" == "6"
@@ -1463,6 +1483,18 @@ lflags = -nologo -machine:$(MACHINE) $(LINKERFLAGS) $(ldebug) lflags = $(lflags) -nodefaultlib:libucrt.lib
!endif
+# Old linkers (Visual C++ 6 in particular) will link for fast loading
+# on Win98. Since we do not support Win98 any more, we specify nowin98
+# as recommended for NT and later. However, this is only required by
+# IX86 on older compilers and only needed if we are not doing a static build.
+
+!if "$(MACHINE)" == "IX86" && !$(STATIC_BUILD)
+!if [nmakehlp -l -opt:nowin98 $(LINKER_TESTFLAGS)]
+# Align sections for PE size savings.
+lflags = $(lflags) -opt:nowin98
+!endif
+!endif
+
dlllflags = $(lflags) -dll
conlflags = $(lflags) -subsystem:console
guilflags = $(lflags) -subsystem:windows
@@ -1507,7 +1539,7 @@ RESCMD = $(rc32) -fo $@ -r -i "$(GENERICDIR)" -i "$(TMP_DIR)" \ /DCOMMAVERSION=$(RCCOMMAVERSION) \
/DDOTVERSION=\"$(DOTVERSION)\" \
/DVERSION=\"$(VERSION)\" \
- /DSUFX=\"$(SUFX:t=)\" \
+ /DSUFX=\"$(SUFX)\" \
/DPROJECT=\"$(PROJECT)\" \
/DPRJLIBNAME=\"$(PRJLIBNAME)\"
@@ -541,14 +541,14 @@ AC_DEFUN([SC_CONFIG_CFLAGS], [ if test "$ac_cv_cross" = "yes"; then case "$do64bit" in amd64|x64|yes) - CC="x86_64-w64-mingw32-gcc" + CC="x86_64-w64-mingw32-${CC}" LD="x86_64-w64-mingw32-ld" AR="x86_64-w64-mingw32-ar" RANLIB="x86_64-w64-mingw32-ranlib" RC="x86_64-w64-mingw32-windres" ;; *) - CC="i686-w64-mingw32-gcc" + CC="i686-w64-mingw32-${CC}" LD="i686-w64-mingw32-ld" AR="i686-w64-mingw32-ar" RANLIB="i686-w64-mingw32-ranlib" @@ -685,10 +685,19 @@ AC_DEFUN([SC_CONFIG_CFLAGS], [ CFLAGS_DEBUG=-g CFLAGS_OPTIMIZE="-O2 -fomit-frame-pointer" - CFLAGS_WARNING="-Wall -Wwrite-strings -Wsign-compare -Wdeclaration-after-statement -Wpointer-arith" + CFLAGS_WARNING="-Wall -Wwrite-strings -Wsign-compare -Wpointer-arith" LDFLAGS_DEBUG= LDFLAGS_OPTIMIZE= + case "${CC}" in + *++) + CFLAGS_WARNING="${CFLAGS_WARNING} -Wno-format" + ;; + *) + CFLAGS_WARNING="${CFLAGS_WARNING} -Wdeclaration-after-statement" + ;; + esac + # Specify the CC output file names based on the target name CC_OBJNAME="-o \[$]@" CC_EXENAME="-o \[$]@" @@ -948,8 +957,6 @@ AC_DEFUN([SC_CONFIG_CFLAGS], [ fi fi - AC_DEFINE(MP_32BIT, 1, [Use 'MP_32BIT' for libtommath]) - # DL_LIBS is empty, but then we match the Unix version AC_SUBST(DL_LIBS) AC_SUBST(CFLAGS_DEBUG) diff --git a/win/tclWinChan.c b/win/tclWinChan.c index 6989344..f5b324f 100644 --- a/win/tclWinChan.c +++ b/win/tclWinChan.c @@ -1068,7 +1068,7 @@ Tcl_MakeFileChannel( int mode) /* ORed combination of TCL_READABLE and * TCL_WRITABLE to indicate file mode. */ { -#if defined(HAVE_NO_SEH) && !defined(_WIN64) +#if defined(HAVE_NO_SEH) && !defined(_WIN64) && !defined(__clang__) TCLEXCEPTION_REGISTRATION registration; #endif char channelName[16 + TCL_INTEGER_SPACE]; @@ -1121,7 +1121,7 @@ Tcl_MakeFileChannel( if (result == 0) { /* - * Unable to make a duplicate. It's definately invalid at this + * Unable to make a duplicate. It's definitely invalid at this * point. */ @@ -1134,7 +1134,7 @@ Tcl_MakeFileChannel( */ result = 0; -#if defined(HAVE_NO_SEH) && !defined(_WIN64) +#if defined(HAVE_NO_SEH) && !defined(_WIN64) && !defined(__clang__) /* * Don't have SEH available, do things the hard way. Note that this * needs to be one block of asm, to avoid stack imbalance; also, it is diff --git a/win/tclWinConsole.c b/win/tclWinConsole.c index 2555387..f1bb75c 100644 --- a/win/tclWinConsole.c +++ b/win/tclWinConsole.c @@ -1380,7 +1380,7 @@ TclWinOpenConsoleChannel( Tcl_SetChannelOption(NULL, infoPtr->channel, "-translation", "auto"); Tcl_SetChannelOption(NULL, infoPtr->channel, "-eofchar", "\032 {}"); - Tcl_SetChannelOption(NULL, infoPtr->channel, "-encoding", "unicode"); + Tcl_SetChannelOption(NULL, infoPtr->channel, "-encoding", "utf-16"); return infoPtr->channel; } diff --git a/win/tclWinInit.c b/win/tclWinInit.c index 1f03b1d..d2fa32c 100644 --- a/win/tclWinInit.c +++ b/win/tclWinInit.c @@ -454,10 +454,16 @@ const char * Tcl_GetEncodingNameFromEnvironment( Tcl_DString *bufPtr) { + UINT acp = GetACP(); + Tcl_DStringInit(bufPtr); - Tcl_DStringSetLength(bufPtr, 2+TCL_INTEGER_SPACE); - wsprintfA(Tcl_DStringValue(bufPtr), "cp%d", GetACP()); - Tcl_DStringSetLength(bufPtr, strlen(Tcl_DStringValue(bufPtr))); + if (acp == CP_UTF8) { + Tcl_DStringAppend(bufPtr, "utf-8", 5); + } else { + Tcl_DStringSetLength(bufPtr, 2+TCL_INTEGER_SPACE); + wsprintfA(Tcl_DStringValue(bufPtr), "cp%d", GetACP()); + Tcl_DStringSetLength(bufPtr, strlen(Tcl_DStringValue(bufPtr))); + } return Tcl_DStringValue(bufPtr); } diff --git a/win/tclWinPort.h b/win/tclWinPort.h index 8882046..ce5e91a 100644 --- a/win/tclWinPort.h +++ b/win/tclWinPort.h @@ -17,6 +17,10 @@ #if !defined(_WIN64) # define __MINGW_USE_VC2005_COMPAT #endif +#if defined(_MSC_VER) && defined(_WIN64) && !defined(STATIC_BUILD) \ + && !defined(MP_32BIT) && !defined(MP_64BIT) +# define MP_64BIT +#endif /* * We must specify the lower version we intend to support. @@ -87,6 +91,8 @@ typedef DWORD_PTR * PDWORD_PTR; #include <limits.h> #ifdef HAVE_STDINT_H # include <stdint.h> +#else +# include "../compat/stdint.h" #endif #ifndef __GNUC__ diff --git a/win/tclWinSerial.c b/win/tclWinSerial.c index cc35f07..fc0255ab 100644 --- a/win/tclWinSerial.c +++ b/win/tclWinSerial.c @@ -2152,7 +2152,7 @@ SerialGetOptionProc( Tcl_DStringStartSublist(dsPtr); } if (len==0 || (len>1 && strncmp(optionName, "-xchar", len) == 0)) { - char buf[TCL_UTF_MAX]; + char buf[4]; valid = 1; if (!GetCommState(infoPtr->handle, &dcb)) { diff --git a/win/tclWinTest.c b/win/tclWinTest.c index d43ba74..07b83a4 100644 --- a/win/tclWinTest.c +++ b/win/tclWinTest.c @@ -13,6 +13,7 @@ # define USE_TCL_STUBS #endif #include "tclInt.h" +#include "tclTomMath.h" /* * For TestplatformChmod on Windows |
