summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--compat/zlib/contrib/minizip/minizip.c10
-rw-r--r--generic/tclBasic.c62
-rw-r--r--generic/tclCmdIL.c2
-rw-r--r--tests/winFCmd.test45
-rw-r--r--tests/zipfs.test2
5 files changed, 70 insertions, 51 deletions
diff --git a/compat/zlib/contrib/minizip/minizip.c b/compat/zlib/contrib/minizip/minizip.c
index 2dd9f10..8a31582 100644
--- a/compat/zlib/contrib/minizip/minizip.c
+++ b/compat/zlib/contrib/minizip/minizip.c
@@ -70,8 +70,8 @@
#ifdef _WIN32
uLong filetime(f, tmzip, dt)
- char *f; /* name of file to get info on */
- tm_zip *tmzip; /* return value: access, modific. and creation times */
+ const char *f; /* name of file to get info on */
+ tm_zip *tmzip; /* return value: access, modific. and creation times */
uLong *dt; /* dostime */
{
int ret = 0;
@@ -94,7 +94,7 @@ uLong filetime(f, tmzip, dt)
#else
#if defined(unix) || defined(__APPLE__)
uLong filetime(f, tmzip, dt)
- char *f; /* name of file to get info on */
+ const char *f; /* name of file to get info on */
tm_zip *tmzip; /* return value: access, modific. and creation times */
uLong *dt; /* dostime */
{
@@ -136,8 +136,8 @@ uLong filetime(f, tmzip, dt)
}
#else
uLong filetime(f, tmzip, dt)
- char *f; /* name of file to get info on */
- tm_zip *tmzip; /* return value: access, modific. and creation times */
+ const char *f; /* name of file to get info on */
+ tm_zip *tmzip; /* return value: access, modific. and creation times */
uLong *dt; /* dostime */
{
return 0;
diff --git a/generic/tclBasic.c b/generic/tclBasic.c
index 09c785e..9832807 100644
--- a/generic/tclBasic.c
+++ b/generic/tclBasic.c
@@ -33,20 +33,33 @@
*/
#ifndef TCL_FPCLASSIFY_MODE
+#if defined(__MINGW32__) && defined(_X86_) /* mingw 32-bit */
/*
* MINGW x86 (tested up to gcc 8.1) seems to have a bug in fpclassify,
- * [fpclassify 1e-314], x86 => normal, x64 => subnormal, so switch to _fpclass
+ * [fpclassify 1e-314], x86 => normal, x64 => subnormal, so switch to using a
+ * version using a compiler built-in.
*/
-# if ( defined(__MINGW32__) && defined(_X86_) ) /* mingw 32-bit */
-# define TCL_FPCLASSIFY_MODE 1
-# elif defined(fpclassify) /* fpclassify */
-# include <float.h>
-# define TCL_FPCLASSIFY_MODE 0
-# elif defined(_FPCLASS_NN) /* _fpclass */
-# define TCL_FPCLASSIFY_MODE 1
-# else /* !fpclassify && !_fpclass (older MSVC), simulate */
-# define TCL_FPCLASSIFY_MODE 2
-# endif /* !fpclassify */
+#define TCL_FPCLASSIFY_MODE 1
+#elif defined(fpclassify) /* fpclassify */
+/*
+ * This is the C99 standard.
+ */
+#include <float.h>
+#define TCL_FPCLASSIFY_MODE 0
+#elif defined(_FPCLASS_NN) /* _fpclass */
+/*
+ * This case handles newer MSVC on Windows, which doesn't have the standard
+ * operation but does have something that can tell us the same thing.
+ */
+#define TCL_FPCLASSIFY_MODE 1
+#else /* !fpclassify && !_fpclass (older MSVC), simulate */
+/*
+ * Older MSVC on Windows. So broken that we just have to do it our way. This
+ * assumes that we're on x86 (or at least a system with classic little-endian
+ * double layout and a 32-bit 'int' type).
+ */
+#define TCL_FPCLASSIFY_MODE 2
+#endif /* !fpclassify */
/* actually there is no fallback to builtin fpclassify */
#endif /* !TCL_FPCLASSIFY_MODE */
@@ -8366,22 +8379,23 @@ ClassifyDouble(
{
#if TCL_FPCLASSIFY_MODE == 0
return fpclassify(d);
-#else /* !fpclassify */
+#else /* TCL_FPCLASSIFY_MODE != 0 */
/*
* If we don't have fpclassify(), we also don't have the values it returns.
* Hence we define those here.
*/
-# ifndef FP_NAN
+#ifndef FP_NAN
# define FP_NAN 1 /* Value is NaN */
# define FP_INFINITE 2 /* Value is an infinity */
# define FP_ZERO 3 /* Value is a zero */
# define FP_NORMAL 4 /* Value is a normal float */
# define FP_SUBNORMAL 5 /* Value has lost accuracy */
-#endif
+#endif /* !FP_NAN */
-# if TCL_FPCLASSIFY_MODE == 3
- return __builtin_fpclassify(FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, FP_ZERO, d);
-# elif TCL_FPCLASSIFY_MODE == 2
+#if TCL_FPCLASSIFY_MODE == 3
+ return __builtin_fpclassify(
+ FP_NAN, FP_INFINITE, FP_NORMAL, FP_SUBNORMAL, FP_ZERO, d);
+#elif TCL_FPCLASSIFY_MODE == 2
/*
* We assume this hack is only needed on little-endian systems.
* Specifically, x86 running Windows. It's fairly easy to enable for
@@ -8408,9 +8422,9 @@ ClassifyDouble(
* Shifts and masks to use with the doubleMeaning variable above.
*/
-# define EXPONENT_MASK 0x7ff /* 11 bits (after shifting) */
-# define EXPONENT_SHIFT 20 /* Moves exponent to bottom of word */
-# define MANTISSA_MASK 0xfffff /* 20 bits (plus 32 from other word) */
+#define EXPONENT_MASK 0x7ff /* 11 bits (after shifting) */
+#define EXPONENT_SHIFT 20 /* Moves exponent to bottom of word */
+#define MANTISSA_MASK 0xfffff /* 20 bits (plus 32 from other word) */
/*
* Extract the exponent (11 bits) and mantissa (52 bits). Note that we
@@ -8447,7 +8461,7 @@ ClassifyDouble(
return FP_NORMAL;
}
-# elif TCL_FPCLASSIFY_MODE == 1
+#elif TCL_FPCLASSIFY_MODE == 1
switch (_fpclass(d)) {
case _FPCLASS_NZ:
case _FPCLASS_PZ:
@@ -8467,9 +8481,9 @@ ClassifyDouble(
case _FPCLASS_SNAN:
return FP_NAN;
}
-# else /* unknown TCL_FPCLASSIFY_MODE */
-# error "unknown or unexpected TCL_FPCLASSIFY_MODE"
-# endif /* TCL_FPCLASSIFY_MODE */
+#else /* TCL_FPCLASSIFY_MODE not in (0..3) */
+#error "unknown or unexpected TCL_FPCLASSIFY_MODE"
+#endif /* TCL_FPCLASSIFY_MODE */
#endif /* !fpclassify */
}
diff --git a/generic/tclCmdIL.c b/generic/tclCmdIL.c
index c11534e..cbb40c6 100644
--- a/generic/tclCmdIL.c
+++ b/generic/tclCmdIL.c
@@ -1958,7 +1958,7 @@ InfoProcsCmd(
/*
* If "info procs" worked like "info commands", returning the commands
* also seen in the global namespace, then you would include this
- * code. As this could break backwards compatibilty with 8.0-8.2, we
+ * code. As this could break backwards compatibility with 8.0-8.2, we
* decided not to "fix" it in 8.3, leaving the behavior slightly
* different.
*/
diff --git a/tests/winFCmd.test b/tests/winFCmd.test
index a0b7053..8a5173a 100644
--- a/tests/winFCmd.test
+++ b/tests/winFCmd.test
@@ -92,8 +92,13 @@ if {[testConstraint testvolumetype]} {
# NB: filename is chosen to be short but unlikely to clash with other apps
if {[file exists c:/] && [file exists d:/]} {
catch {file delete d:/TclTmpF.1}
- if {[catch {createfile d:/TclTmpF.1 {}}] == 0} {
- file delete d:/TclTmpF.1
+ catch {file delete d:/TclTmpD.1}
+ catch {file delete c:/TclTmpC.1}
+ if {![catch {createfile d:/TclTmpF.1 {}}] && [file isfile d:/TclTmpF.1]
+ && ![catch {file mkdir d:/TclTmpD.1}] && [file isdirectory d:/TclTmpD.1]
+ && ![catch {file mkdir c:/TclTmpC.1}] && [file isdirectory c:/TclTmpC.1]
+ } {
+ file delete d:/TclTmpF.1 d:/TclTmpD.1 c:/TclTmpC.1
testConstraint exdev 1
}
}
@@ -173,12 +178,12 @@ test winFCmd-1.9 {TclpRenameFile: errno: ENOTDIR} -setup {
testfile mv td1 tf1
} -returnCodes error -result ENOTDIR
test winFCmd-1.10 {TclpRenameFile: errno: EXDEV} -setup {
- file delete -force d:/tf1
+ file delete -force d:/TclTmpD.1
} -constraints {win exdev testfile} -body {
- file mkdir c:/tf1
- testfile mv c:/tf1 d:/tf1
+ file mkdir c:/TclTmpC.1
+ testfile mv c:/TclTmpC.1 d:/TclTmpD.1
} -cleanup {
- file delete -force c:/tf1
+ file delete -force c:/TclTmpC.1
} -returnCodes error -result EXDEV
test winFCmd-1.11 {TclpRenameFile: errno: EACCES} -setup {
cleanup
@@ -316,15 +321,15 @@ test winFCmd-1.32 {TclpRenameFile: TclpRemoveDirectory succeeds} -setup {
} -result {0 1 1}
test winFCmd-1.33 {TclpRenameFile: After removing dst dir, MoveFile fails} \
-constraints {win exdev testfile testchmod} -body {
- file mkdir d:/td1
- testchmod 0 d:/td1
- file mkdir c:/tf1
- catch {testfile mv c:/tf1 d:/td1} msg
- list $msg [file writable d:/td1]
-} -cleanup {
- catch {testchmod 0o666 d:/td1}
- file delete d:/td1
- file delete -force c:/tf1
+ file mkdir d:/TclTmpD.1
+ testchmod 0 d:/TclTmpD.1
+ file mkdir c:/TclTmpC.1
+ catch {testfile mv c:/TclTmpC.1 d:/TclTmpD.1} msg
+ list $msg [file writable d:/TclTmpD.1]
+} -cleanup {
+ catch {testchmod 0o666 d:/TclTmpD.1}
+ file delete d:/TclTmpD.1
+ file delete -force c:/TclTmpC.1
} -result {EXDEV 0}
test winFCmd-1.34 {TclpRenameFile: src is dir, dst is not} -setup {
cleanup
@@ -1048,13 +1053,13 @@ test winFCmd-12.5 {ConvertFileNameFormat: absolute path} -body {
list [file attributes / -longname] [file attributes \\ -longname]
} -constraints {win} -result {/ /}
test winFCmd-12.6 {ConvertFileNameFormat: absolute path with drive} -setup {
- catch {file delete -force -- c:/td1}
+ catch {file delete -force -- c:/TclTmpC.1}
} -constraints {win winXP} -body {
- createfile c:/td1 {}
- string tolower [file attributes c:/td1 -longname]
+ createfile c:/TclTmpC.1 {}
+ string tolower [file attributes c:/TclTmpC.1 -longname]
} -cleanup {
- file delete -force -- c:/td1
-} -result {c:/td1}
+ file delete -force -- c:/TclTmpC.1
+} -result [string tolower {c:/TclTmpC.1}]
test winFCmd-12.6.2 {ConvertFileNameFormat: absolute path with drive (in temp folder)} -setup {
catch {file delete -force -- $::env(TEMP)/td1}
} -constraints {win} -body {
diff --git a/tests/zipfs.test b/tests/zipfs.test
index 782d032..2ecbdfa 100644
--- a/tests/zipfs.test
+++ b/tests/zipfs.test
@@ -45,7 +45,7 @@ if {![string match ${ziproot}* $tcl_library]} {
# archive
###
set tclzip [file join $CWD [::tcl::pkgconfig get zipfile,runtime]]
- testConstraint zipfslib [file exists $tclzip]
+ testConstraint zipfslib [file isfile $tclzip]
if {[testConstraint zipfslib]} {
zipfs mount /lib/tcl $tclzip
set ::tcl_library ${ziproot}lib/tcl/tcl_library