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) {

Reply via email to