* News: zsh-4.1.1-nonstop-fp
@ 2004-03-06 14:59 Nelson H. F. Beebe
2004-03-11 4:39 ` Clint Adams
2004-03-11 11:35 ` Oliver Kiddle
0 siblings, 2 replies; 3+ messages in thread
From: Nelson H. F. Beebe @ 2004-03-06 14:59 UTC (permalink / raw)
To: zsh-workers; +Cc: beebe
At
ftp://ftp.math.utah.edu/pub/zsh/
http://www.math.utah.edu/pub/zsh/
can be found a distribution extending zsh-4.1.1
-rw-rw-r-- 1 beebe staff 1925744 Feb 28 08:11 zsh-4.1.1-nonstop-fp.tar.bz2
-rw-rw-r-- 1 beebe staff 2437015 Feb 28 08:11 zsh-4.1.1-nonstop-fp.tar.gz
that contains improvements in the handling of floating-point
arithmetic. I invite comments from the zsh developers, and I plan in
the future, when some other projects are complete, to make similar
changes to the AT&T ksh93 distribution, and submit them to its
developers.
The motivation for the changes, and their testing on many different
Unix platforms, is fully documented in the README.NONSTOP-FP file in
the distribution, and also available separately in the above
directory, so I won't repeat it here.
If the changes meet with zsh developer approval, I'd like to see them
made standard in the next release of zsh.
-------------------------------------------------------------------------------
- Nelson H. F. Beebe Tel: +1 801 581 5254 -
- University of Utah FAX: +1 801 581 4148 -
- Department of Mathematics, 110 LCB Internet e-mail: beebe@math.utah.edu -
- 155 S 1400 E RM 233 beebe@acm.org beebe@computer.org -
- Salt Lake City, UT 84112-0090, USA URL: http://www.math.utah.edu/~beebe -
-------------------------------------------------------------------------------
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: News: zsh-4.1.1-nonstop-fp
2004-03-06 14:59 News: zsh-4.1.1-nonstop-fp Nelson H. F. Beebe
@ 2004-03-11 4:39 ` Clint Adams
2004-03-11 11:35 ` Oliver Kiddle
1 sibling, 0 replies; 3+ messages in thread
From: Clint Adams @ 2004-03-11 4:39 UTC (permalink / raw)
To: zsh-workers; +Cc: Nelson H. F. Beebe
> If the changes meet with zsh developer approval, I'd like to see them
> made standard in the next release of zsh.
The diff from 4.1.1, autogenerated files removed, whitespace ignored,
README removed. Doesn't apply cleanly to HEAD (rejects on Src/init.c
and zshconfig.ac); two simple tweaks are necessary.
diff -Nurb zsh-4.1.1/ksh93-test.sh zsh-4.1.1-nonstop-fp/ksh93-test.sh
--- zsh-4.1.1/ksh93-test.sh 1969-12-31 19:00:00.000000000 -0500
+++ zsh-4.1.1-nonstop-fp/ksh93-test.sh 2004-02-27 21:07:12.000000000 -0500
@@ -0,0 +1,396 @@
+#! /usr/local/bin/ksh -
+echo
+echo "This is a test of features of ksh93 and zsh"
+echo
+
+if test -n "$ZSH_VERSION" # zsh only: need to force load of math function features
+then
+ zmodload zsh/mathfunc || true
+fi
+
+fpmacheps()
+{
+ # set machine epsilon in global variable eps on return
+
+ typeset x
+
+ eps=$1
+ x=$1
+ while test $(( (x + eps / 2.0) != x )) -eq 1
+ do
+ eps=$(( eps / 2.0 ))
+ done
+}
+
+fpprec()
+{
+ echo ------------------------------------------------------------------------
+ echo What is floating-point precision\?
+ echo
+
+ fpmacheps 1.0
+
+ printf "Machine epsilon = %.2e\t%.2f decimal digits\n" $eps $(( -log(eps)/log(10) ))
+}
+
+fpinfinity()
+{
+ echo ------------------------------------------------------------------------
+ echo Is floating-point infinity supported\?
+ echo
+
+ typeset x y Infinity
+
+ x=2.0
+ Infinity=$(( x ** 20000))
+ printf "Infinity by 2**20000 = %.2e\n" $Infinity
+ echo
+
+ x=1.0
+ y=0.0
+ Infinity=$(( x /y ))
+ printf "Infinity by 1/0 = %.2e\n" $Infinity
+ test $((Infinity == Infinity)) -eq 1 && printf "Infinity == Infinity is true (OK)"
+ test $((Infinity == Infinity)) -ne 1 && printf "Infinity == Infinity is false (WRONG)"
+ echo
+}
+
+fpnan()
+{
+ echo ------------------------------------------------------------------------
+ echo Is floating-point NaN supported\?
+ echo
+
+ typeset x y NaN
+
+ x=0.0
+ y=0.0
+ NaN=$(( x / y))
+ echo "echo says: NaN =" $NaN
+ printf "printf says: NaN = %.2e\n" $NaN
+ test $((NaN != NaN)) -eq 1 && printf "NaN != NaN is true (OK)"
+ test $((NaN != NaN)) -ne 1 && printf "NaN != NaN is false (WRONG)"
+ echo
+}
+
+fpoverflow()
+{
+ echo ------------------------------------------------------------------------
+ echo What is floating-point overflow limit\?
+ echo
+
+ typeset x y
+
+ fpmacheps 1.0
+ x=$(( 1.0 - eps / 2.0 ))
+ y=1.0
+ while test $(( (y + y) > y )) -eq 1
+ do
+ # printf "DEBUG 1: x = %.15e\n" $x
+ x=$(( x + x ))
+ y=$(( y + y ))
+ # echo "DEBUG 2: x = " $x
+ # printf "DEBUG 3: x = %.15e\n" $x
+ done
+ printf "Overflow limit near %.15e\n" $x
+}
+
+fpsignedzero()
+{
+ echo ------------------------------------------------------------------------
+ echo Are signed zeros supported\?
+ echo
+
+ typeset x y z
+
+ x=0.0
+ printf 'x=0.0:\tmust be 0.0:\tgot %.1f\n' x
+
+ x=-0.0
+ printf 'x=-0.0:\tmust be -0.0:\tgot %.1f\n' x
+
+ x=0.0
+ x=$(( -x ))
+ printf 'x=0.0\tx=$(( -x )):\tmust be -0.0:\tgot %.1f\n' x
+
+ x=0.0
+ y=$(( sqrt(x) ))
+ printf 'x=0.0\ty=$(( sqrt(x) )):\tmust be 0.0:\tgot %.1f\n' y
+
+ x=0.0
+ y=$(( sqrt(-x) ))
+ printf 'x=0.0\ty=$(( sqrt(-x) )):\tmust be -0.0:\tgot %.1f\n' y
+
+ x=1.0
+ y=$(( 1.0 / 0.0 ))
+ z=$(( 1.0 / y ))
+ printf 'x=0.0\ty=$(( 1.0 / 0.0 ))\tz=$(( 1.0 / y )):\tmust be 0.0:\tgot %.1f\n' z
+
+ x=1.0
+ y=$(( 1.0 / 0.0 ))
+ z=$(( -1.0 / y ))
+ printf 'x=0.0\ty=$(( 1.0 / 0.0 ))\tz=$(( -1.0 / y )):\tmust be -0.0:\tgot %.1f\n' z
+
+ echo
+}
+
+fpsubnormal()
+{
+ echo ------------------------------------------------------------------------
+ echo Are IEEE 754 subnormal numbers supported\?
+ echo
+
+ typeset base s x
+
+ base=2.0 # correct for all UNIX systems (even IBM S/390 with G5 boards)
+ fpmacheps 1.0
+
+ # printf "DEBUG: eps = %.16a\n" $eps
+
+ x=$((1 - eps / base)) # x has all significand bits of one: 1.fffff...p+0
+ k=0
+ for ((s = 1.0; (s > 0.0) && (((x * s) / s) == x) ; s /= base, k--))
+ do
+ # printf "DEBUG: %d\t%.16e\n" $k $s
+ :
+ done
+ if test $(( (s == 0) || (s/2 == 0) )) -eq 1
+ then
+ printf "Arithmetic on this system underflows abruptly to zero: no subnormals, sigh...\n"
+ # printf "DEBUG: x = %.16a\n" $x
+ printf "x = (1 - eps / %d) = %.16e\n" $base $x
+ printf "s = %.16e (= 2.0**%d)\n" $s $k
+ printf "%d * x * s = %.16e\n" $base $(( base * x * s ))
+ printf "(1 + eps) * x * s = %.16e\n" $(( (1 + eps) * x * s ))
+ printf "%d * x * s = %.16e\n" 1 $(( x * s ))
+ else
+ printf "This system appears to support subnormals starting at values at or below\n"
+ printf "\t%.16e\n\n" $s
+ printf "If these really are IEEE 754 64-bit subnormals, then there should be 14 values\n"
+ printf "at multiples of 1/16, before we hit zero. Let's find out!\n\n"
+ # k=-1022
+ for (( ; s > 0.0; s /= 16, k = k - 4 ))
+ do
+ printf "%3d\t%d\t%.16e\n" $(( 1 - (k + 1022)/4 )) $k $s
+ done
+ printf "%3d\t%d\t%.16e\n" $(( 1 - (k + 1022)/4 )) $k $s
+ fi
+
+ echo
+}
+
+fpunderflow()
+{
+ echo ------------------------------------------------------------------------
+ echo What is floating-point underflow limit\?
+ echo
+
+ typeset n x
+
+ let x=1.0
+ n=0
+
+ while test $(( (x / 2.0) > 0.0 )) -gt 0
+ do
+ x=$(( x / 2.0 ))
+ n=$(( n - 1 ))
+ # printf "DEBUG: x = %.2e\t%d\n" $x $n
+ done
+ printf "Underflow limit near %.2e\n" $x
+}
+
+brace_expansion()
+{
+ echo ------------------------------------------------------------------------
+ echo Is brace expansion supported\?
+ echo
+ echo 'echo {one,two,three}.ext produces: ' {one,two,three}.ext
+ echo
+ echo Here is how other shells handle brace expansion:
+ echo
+
+ typeset sh
+
+ for sh in /bin/sh \
+ /bin/ksh \
+ /bin/csh \
+ /bin/jsh \
+ /bin/zsh \
+ /usr/local/bin/bash \
+ /usr/local/bin/ksh \
+ /usr/local/bin/pdksh \
+ /usr/local/bin/tcsh
+ do
+ if test -x $sh
+ then
+ printf "%-24s\t" $sh
+ echo 'echo {one,two,three}.ext' | $sh
+ fi
+ done
+ echo
+}
+
+indexed_arrays()
+{
+ echo ------------------------------------------------------------------------
+ echo Are indexed arrays supported\?
+ echo
+
+ typeset i name
+
+ name=(Alice Bob Carol Dave)
+
+ echo "Zeroth name: "'${name[0]} = '${name[0]}
+ echo "First name: "'${name[1]} = '${name[1]}
+ echo "Second name: "'${name[2]} = '${name[2]}
+ echo "Third name: "'${name[3]} = '${name[3]}
+ echo "Number of names: "'${#name[*]} = '${#name[*]}
+
+ echo
+ echo Test of array element sizes
+ echo
+
+ echo "Length of zeroth name: "'${#name[0]} = '${#name[0]}
+ echo "Length of first name: "'${#name[1]} = '${#name[1]}
+ echo "Length of second name: "'${#name[2]} = '${#name[2]}
+ echo "Length of third name: "'${#name[3]} = '${#name[3]}
+ echo
+}
+
+associative_arrays()
+{
+ echo ------------------------------------------------------------------------
+ echo Are associative arrays and C-style for loops supported\?
+ echo
+
+ typeset i name
+
+ name=(Alice Bob Carol Dave)
+
+ for ((i = 0; i < 4; ++i))
+ do
+ len[${name[$i]}]=${#name[$i]}
+ echo 'len[${name['$i']}] = '${len[${name[$i]}]}
+ done
+ echo
+}
+
+fparith()
+{
+ echo ------------------------------------------------------------------------
+ echo Is floating-point arithmetic supported\?
+ echo
+
+ typeset x
+
+ x=0.0
+ while test $x -lt 5.0
+ do
+ printf "printf: %s = %.3f\t" x $x
+ echo "echo: x = $x"
+ x=$((x + 0.25))
+ done
+ echo
+}
+
+fpfunctions()
+{
+ echo ------------------------------------------------------------------------
+ echo Are floating-point functions supported\?
+ echo
+
+ typeset x
+
+ x=0.125
+ printf "%7s\t%7s\t%7s\t%7s\t%7s\t%7s\t%7s\n" x cos exp log sin sqrt tan
+ while test $x -le 4.0
+ do
+ printf "%7.4f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\n" \
+ $x $((cos(x))) $((exp(x))) $((log(x))) $((sin(x))) $((sqrt(x))) $((tan(x)))
+ x=$((x + 0.125))
+ done
+ echo
+
+ x=0.0
+ printf "%7s\t%7s\t%7s\t%7s\t%7s\t%7s\t%7s\n" x acos asin atan cosh sinh tanh
+ while test $x -le 1.0
+ do
+ printf "%7.4f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\n" \
+ $x $((acos(x))) $((asin(x))) $((atan(x))) $((cosh(x))) $((sinh(x))) $((tanh(x)))
+ x=$((x + 0.0625))
+ done
+ echo
+
+ test -z "$ZSH_VERSION" && return
+
+ echo ------------------------------------------------------------------------
+ echo Are zsh-extension floating-point functions supported\?
+ echo
+
+ # zsh offers additional functions that we can sample (though
+ # we don't yet try the functions of two arguments)
+
+ x=0.5
+ printf "%7s\t%7s\t%7s\t%7s\t%7s\t%7s\t%7s\n" x acosh asinh atanh cbrt erf erfc
+ while test $x -le 2.0
+ do
+ printf "%7.4f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\n" \
+ $x $((acosh(x))) $((asinh(x))) $((atanh(x))) $((cbrt(x))) $((erf(x))) $((erfc(x)))
+ x=$((x + 0.0625))
+ done
+ echo
+
+ x=0.0
+ printf "%7s\t%7s\t%7s\t%7s\t%7s\t%7s\t%7s\n" x expm1 ceil fabs floor gamma ilogb
+ while test $x -le 1.0
+ do
+ printf "%7.4f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\n" \
+ $x $((expm1(x))) $((ceil(x))) $((fabs(x))) $((floor(x))) $((gamma(x))) $((ilogb(x)))
+ x=$((x + 0.0625))
+ done
+ echo
+
+ x=0.0
+ printf "%7s\t%7s\t%7s\t%7s\t%7s\t%7s\t%7s\n" x j0 j1 lgamma log10 log1p logb
+ while test $x -le 1.0
+ do
+ printf "%7.4f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\n" \
+ $x $((j0(x))) $((j1(x))) $((lgamma(x))) $((log10(x))) $((log1p(x))) $((logb(x)))
+ x=$((x + 0.0625))
+ done
+ echo
+
+ x=1.0625
+ printf "%7s\t%7s\t%7s\t%7s\t%7s\t%7s\t%7s\n" x rint y0 y1
+ while test $x -le 10.0
+ do
+ printf "%7.4f\t%7.3f\t%7.3f\t%7.3f\n" \
+ $x $((rint(x))) $((y0(x))) $((y1(x)))
+ x=$((x + 0.5))
+ done
+ echo
+
+}
+
+# Run the tests: several of them show a botched implementation and
+# understanding in ksh of floating-point arithmetic, and they have to
+# be disabled, sigh...
+
+fparith || true
+fpprec || true
+fpsubnormal
+fpunderflow || true
+
+if test -n "$ZSH_VERSION" # zsh only: ksh botches these
+then
+ fpoverflow || true
+ fpinfinity || true
+ fpnan || true
+fi
+
+fpfunctions || true
+fpsignedzero || true
+
+brace_expansion || true
+indexed_arrays || true
+associative_arrays || true
diff -Nurb zsh-4.1.1/Src/init.c zsh-4.1.1-nonstop-fp/Src/init.c
--- zsh-4.1.1/Src/init.c 2003-05-15 05:25:21.000000000 -0400
+++ zsh-4.1.1-nonstop-fp/Src/init.c 2004-02-27 21:37:26.000000000 -0500
@@ -1178,6 +1178,26 @@
return 1;
}
+#if defined(NONSTOP_FP)
+#if defined(HAVE_GET_FPC_CSR)
+#include <sys/fpu.h>
+#endif
+
+static void
+flush_to_zero(int on_off) /* see "man sigfpe" on SGI IRIX 6.x for documentation */
+{
+#if defined(HAVE_GET_FPC_CSR)
+ union fpc_csr n;
+
+ n.fc_word = get_fpc_csr();
+ n.fc_struct.flush = (on_off ? 1 : 0);
+ set_fpc_csr(n.fc_word);
+#endif
+}
+#endif
+
+
+
/*
* This is real main entry point. This has to be mod_export'ed
* so zsh.exe can found it on Cygwin
@@ -1193,6 +1213,10 @@
setlocale(LC_ALL, "");
#endif
+#if defined(NONSTOP_FP)
+ flush_to_zero(0);
+#endif
+
init_hackzero(argv, environ);
/*
diff -Nurb zsh-4.1.1/Src/math.c zsh-4.1.1-nonstop-fp/Src/math.c
--- zsh-4.1.1/Src/math.c 2003-04-04 08:56:27.000000000 -0500
+++ zsh-4.1.1-nonstop-fp/Src/math.c 2004-02-27 21:38:29.000000000 -0500
@@ -31,6 +31,7 @@
#include "math.pro"
#include <math.h>
+#include <string.h>
/* nonzero means we are not evaluating, just parsing */
@@ -189,6 +190,38 @@
/**/
int outputradix;
+
+#if !defined(HAVE_ISINF)
+/**/
+int
+(isinf)(double x)
+{
+ if ((-1.0 < x) && (x < 1.0)) /* x is small, and thus finite */
+ return (0);
+ else if ((x + x) == x) /* only true if x == Infinity */
+ return (1);
+ else /* must be finite (normal or subnormal), or NaN */
+ return (0);
+}
+#endif
+
+#if !defined(HAVE_ISNAN)
+/**/
+static double
+(store)(double *x)
+{
+ return (*x);
+}
+
+/**/
+int
+(isnan)(double x)
+{
+ /* (x != x) should be sufficient, but some compilers incorrectly optimize it away */
+ return (store(&x) != store(&x));
+}
+#endif
+
/**/
static int
zzlex(void)
@@ -391,6 +424,24 @@
}
/* Fall through! */
default:
+#if defined(NONSTOP_FP)
+ if (strcmp(ptr-1,"NaN") == 0)
+ {
+ yyval.type = MN_FLOAT;
+ yyval.u.d = 0.0;
+ yyval.u.d /= yyval.u.d;
+ ptr += 2;
+ return NUM;
+ }
+ else if (strcmp(ptr-1,"Inf") == 0)
+ {
+ yyval.type = MN_FLOAT;
+ yyval.u.d = 0.0;
+ yyval.u.d = 1.0 / yyval.u.d;
+ ptr += 2;
+ return NUM;
+ }
+#endif
if (idigit(*--ptr) || *ptr == '.') {
char *nptr;
for (nptr = ptr; idigit(*nptr); nptr++);
@@ -603,10 +654,12 @@
static int
notzero(mnumber a)
{
+#if !defined(NONSTOP_FP)
if ((a.type & MN_INTEGER) ? a.u.l == 0 : a.u.d == 0.0) {
zerr("division by zero", NULL, 0);
return 0;
}
+#endif
return 1;
}
diff -Nurb zsh-4.1.1/Src/Modules/mathfunc.c zsh-4.1.1-nonstop-fp/Src/Modules/mathfunc.c
--- zsh-4.1.1/Src/Modules/mathfunc.c 2002-10-15 14:00:01.000000000 -0400
+++ zsh-4.1.1-nonstop-fp/Src/Modules/mathfunc.c 2004-02-27 10:19:18.000000000 -0500
@@ -211,6 +211,7 @@
if (errflag)
return ret;
+#if !defined(NONSTOP_FP)
if (id & 0xff00) {
int rtst = 0;
@@ -253,6 +254,7 @@
return ret;
}
}
+#endif
switch (id & 0xff) {
case MF_ABS:
diff -Nurb zsh-4.1.1/Src/params.c zsh-4.1.1-nonstop-fp/Src/params.c
--- zsh-4.1.1/Src/params.c 2003-05-06 11:39:56.000000000 -0400
+++ zsh-4.1.1-nonstop-fp/Src/params.c 2004-02-27 14:44:05.000000000 -0500
@@ -32,6 +32,13 @@
#include "version.h"
+#if defined(NONSTOP_FP)
+#include <math.h>
+int (isinf)(double);
+int (isnan)(double);
+#endif
+
+
/* what level of localness we are at */
/**/
@@ -3463,11 +3470,20 @@
ret = NULL;
} else {
VARARR(char, buf, 512 + digits);
+#if defined(NONSTOP_FP)
+ if (isinf(dval))
+ ret = dupstring((dval < 0.0) ? "-Inf" : "Inf");
+ else if (isnan(dval))
+ ret = dupstring("NaN");
+ else
+#endif
+ {
sprintf(buf, fmt, digits, dval);
if (!strchr(buf, 'e') && !strchr(buf, '.'))
strcat(buf, ".");
ret = dupstring(buf);
}
+ }
#ifdef USE_LOCALE
if (prev_locale) setlocale(LC_NUMERIC, prev_locale);
#endif
diff -Nurb zsh-4.1.1/zshconfig.ac zsh-4.1.1-nonstop-fp/zshconfig.ac
--- zsh-4.1.1/zshconfig.ac 2003-05-06 11:39:03.000000000 -0400
+++ zsh-4.1.1-nonstop-fp/zshconfig.ac 2004-02-27 19:57:04.000000000 -0500
@@ -962,7 +962,8 @@
pcre_compile pcre_study pcre_exec \
nl_langinfo \
erand48 open_memstream \
- wctomb iconv)
+ wctomb iconv \
+ get_fpc_csr isinf isnan)
AC_FUNC_STRCOLL
dnl Check if tgetent accepts NULL (and will allocate its own termcap buffer)
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: News: zsh-4.1.1-nonstop-fp
2004-03-06 14:59 News: zsh-4.1.1-nonstop-fp Nelson H. F. Beebe
2004-03-11 4:39 ` Clint Adams
@ 2004-03-11 11:35 ` Oliver Kiddle
1 sibling, 0 replies; 3+ messages in thread
From: Oliver Kiddle @ 2004-03-11 11:35 UTC (permalink / raw)
To: Nelson H. F. Beebe; +Cc: zsh-workers
On 6 Mar, "Nelson H. F. Beebe" wrote:
>
> that contains improvements in the handling of floating-point
> arithmetic. I invite comments from the zsh developers, and I plan in
This definitely looks good to me.
It's a pity printf outputs `nan' and `inf' in lowercase while it
otherwise uses `NaN' and `Inf'. The printf builtin could be changed but
it isn't trivial because of things like the width modifiers. printf's
output may even be platform specific.
It might be better to add readonly special variables named Inf and NaN
instead of modifying zzlex to do a strcmp. Given the following existing
behaviour, I think that'd work:
% y=x
% x=3.141
% echo $(( y ))
3.141
Note that you can do things like:
(( x = 1.0 / 0.0 ))
instead of:
x=$(( 1.0 / 0.0 ))
You are otherwise getting conversions via a string which is less
efficient and for some numbers will lose you a lot of precision.
Similarly, the builtin printf allows things like:
printf '%g\n' x
instead of:
printf '%g\n' $x
and even things like:
printf '%g\n' '1.0 / 0.0'
I just noticed that the scripts used the other forms which may be
necessary for compatibility with other shells.
Looking through the patch Clint sent, we could probably remove the
NONSTOP_FP preprocessor define. Can't see that we'd have a need for a
--disable-nonstop-fp configure option. The ksh93-test.sh script is
testing the capabilities of various shells rather than the nonstop-fp
functionality so we probably don't need it. Examples from the README
could be adapted for something in the Test directory though.
Oliver
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2004-03-11 11:36 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-03-06 14:59 News: zsh-4.1.1-nonstop-fp Nelson H. F. Beebe
2004-03-11 4:39 ` Clint Adams
2004-03-11 11:35 ` Oliver Kiddle
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).