Module Name: src
Committed By: christos
Date: Sat Apr 11 20:28:28 UTC 2020
Modified Files:
src/lib/libc/gdtoa: hdtoa.c
Log Message:
Via enh at google dot com in tech-userlevel. Fix handling of
EXT_FRAC{H,L}BITS (although we don't need to since we don't have them).
To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/lib/libc/gdtoa/hdtoa.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/lib/libc/gdtoa/hdtoa.c
diff -u src/lib/libc/gdtoa/hdtoa.c:1.9 src/lib/libc/gdtoa/hdtoa.c:1.10
--- src/lib/libc/gdtoa/hdtoa.c:1.9 Mon Jul 4 07:46:41 2011
+++ src/lib/libc/gdtoa/hdtoa.c Sat Apr 11 16:28:28 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: hdtoa.c,v 1.9 2011/07/04 11:46:41 mrg Exp $ */
+/* $NetBSD: hdtoa.c,v 1.10 2020/04/11 20:28:28 christos Exp $ */
/*-
* Copyright (c) 2004, 2005 David Schultz <[email protected]>
@@ -30,7 +30,7 @@
#if 0
__FBSDID("$FreeBSD: src/lib/libc/gdtoa/_hdtoa.c,v 1.4 2007/01/03 04:57:58 das Exp $");
#else
-__RCSID("$NetBSD: hdtoa.c,v 1.9 2011/07/04 11:46:41 mrg Exp $");
+__RCSID("$NetBSD: hdtoa.c,v 1.10 2020/04/11 20:28:28 christos Exp $");
#endif
#include <float.h>
@@ -310,23 +310,34 @@ hldtoa(long double e, const char *xdigs,
*/
for (s = s0 + bufsize - 1; s > s0 + sigfigs - 1; s--)
*s = 0;
- for (; s > s0 + sigfigs - (EXT_FRACLBITS / 4) - 1 && s > s0; s--) {
+ for (; s > s0 + sigfigs -
+ (EXT_FRACLBITS / 4) - 1 && s > s0; s--) {
*s = u.extu_ext.ext_fracl & 0xf;
u.extu_ext.ext_fracl >>= 4;
}
#ifdef EXT_FRACHMBITS
- for (; s > s0; s--) {
+ for (; s > s0 + sigfigs -
+ ((EXT_FRACLBITS + EXT_FRACHMBITS) / 4) - 1; s--) {
*s = u.extu_ext.ext_frachm & 0xf;
u.extu_ext.ext_frachm >>= 4;
}
+#else
+#define EXT_FRACHMBITS 0
#endif
+
#ifdef EXT_FRACLMBITS
- for (; s > s0; s--) {
+ for (; s > s0 + sigfigs -
+ ((EXT_FRACLBITS + EXT_FRACHMBITS + EXT_FRACLMBITS) / 4) - 1; s--) {
+
*s = u.extu_ext.ext_fraclm & 0xf;
u.extu_ext.ext_fraclm >>= 4;
}
+#else
+#define EXT_FRACLMBITS 0
#endif
- for (; s > s0; s--) {
+
+ for (; s > s0 + sigfigs -
+ ((EXT_FRACLBITS + EXT_FRACHMBITS + EXT_FRACLMBITS + EXT_FRACHBITS) / 4) - 1; s--) {
*s = u.extu_ext.ext_frach & 0xf;
u.extu_ext.ext_frach >>= 4;
}
@@ -337,7 +348,7 @@ hldtoa(long double e, const char *xdigs,
* (partial) nibble, which is dealt with by the next
* statement. We also tack on the implicit normalization bit.
*/
- *s = u.extu_ext.ext_frach | (1U << ((LDBL_MANT_DIG - 1) % 4));
+ *s = (u.extu_ext.ext_frach | (1U << ((LDBL_MANT_DIG - 1) % 4))) 0xf;
/* If ndigits < 0, we are expected to auto-size the precision. */
if (ndigits < 0) {