Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 18 Mar 2012 14:49:36 +0000 (UTC)
From:      Kevin Lo <kevlo@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org
Subject:   svn commit: r233119 - in stable/9/usr.bin: bc dc
Message-ID:  <201203181449.q2IEnanM023678@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kevlo
Date: Sun Mar 18 14:49:36 2012
New Revision: 233119
URL: http://svn.freebsd.org/changeset/base/233119

Log:
  MFC r232994:
  - Fix an erroneous invocation of the editline.
  - Fix wrong scaling in the bc.library.
  - Let length(0.000) conform to what gnu bc does.
  
  PR:	bin/159227
  Submitted by:	AIDA Shinra <shinra at j10n dot org>

Modified:
  stable/9/usr.bin/bc/bc.library
  stable/9/usr.bin/bc/bc.y
  stable/9/usr.bin/dc/bcode.c
Directory Properties:
  stable/9/usr.bin/   (props changed)

Modified: stable/9/usr.bin/bc/bc.library
==============================================================================
--- stable/9/usr.bin/bc/bc.library	Sun Mar 18 13:54:57 2012	(r233118)
+++ stable/9/usr.bin/bc/bc.library	Sun Mar 18 14:49:36 2012	(r233119)
@@ -46,7 +46,9 @@ define e(x) {
 	r = ibase
 	ibase = A
 	t = scale
-	scale = t + .434*x + 1
+	scale = 0
+	if (x > 0) scale = (0.435*x)/1
+	scale = scale + t + 1
 
 	w = 0
 	if (x < 0) {
@@ -95,26 +97,33 @@ define l(x) {
 	t = scale
 
 	f = 1
-	scale = scale + scale(x) - length(x) + 1
-	s = scale
+	if (x < 1) {
+		s = scale(x)
+	} else {
+		s = length(x) - scale(x)
+	}
+	scale = 0
+	a = (2.31*s)/1 /* estimated integer part of the answer */
+	s = t + length(a) + 2 /* estimated length of the answer */
 	while (x > 2) {
-		s = s + (length(x) - scale(x))/2 + 1
-		if (s > 0) scale = s
+		scale=0
+		scale = (length(x) + scale(x))/2 + 1
+		if (scale < s) scale = s
 		x = sqrt(x)
 		f = f*2
 	}
 	while (x < .5) {
-		s = s + (length(x) - scale(x))/2 + 1
-		if (s > 0) scale = s
+		scale = 0
+		scale = scale(x)/2 + 1
+		if (scale < s) scale = s
 		x = sqrt(x)
 		f = f*2
 	}
 
-	scale = t + length(f) - scale(f) + 1
+	scale = t + length(f) + length(t + length(f)) + 1
 	u = (x - 1)/(x + 1)
-
-	scale = scale + 1.1*length(t) - 1.1*scale(t)
 	s = u*u
+	scale = t + 2
 	b = 2*f
 	c = b
 	d = 1
@@ -261,3 +270,4 @@ define j(n,x) {
 		e = g
 	}
 }
+/* vim: set filetype=bc shiftwidth=8 noexpandtab: */

Modified: stable/9/usr.bin/bc/bc.y
==============================================================================
--- stable/9/usr.bin/bc/bc.y	Sun Mar 18 13:54:57 2012	(r233118)
+++ stable/9/usr.bin/bc/bc.y	Sun Mar 18 14:49:36 2012	(r233119)
@@ -48,6 +48,7 @@ __FBSDID("$FreeBSD$");
 #include <stdbool.h>
 #include <string.h>
 #include <unistd.h>
+#include <stdlib.h>
 
 #include "extern.h"
 #include "pathnames.h"
@@ -1093,7 +1094,7 @@ sigchld(int signo)
 	switch (signo) {
 	default:
 		for (;;) {
-			pid = waitpid(dc, &status, WCONTINUED);
+			pid = waitpid(dc, &status, WUNTRACED);
 			if (pid == -1) {
 				if (errno == EINTR)
 					continue;
@@ -1181,16 +1182,6 @@ main(int argc, char *argv[])
 			dup(p[1]);
 			close(p[0]);
 			close(p[1]);
-			if (interactive) {
-				el = el_init("bc", stdin, stderr, stderr);
-				hist = history_init();
-				history(hist, &he, H_SETSIZE, 100);
-				el_set(el, EL_HIST, history, hist);
-				el_set(el, EL_EDITOR, "emacs");
-				el_set(el, EL_SIGNAL, 1);
-				el_set(el, EL_PROMPT, dummy_prompt);
-				el_source(el, NULL);
-			}
 		} else {
 			close(STDIN_FILENO);
 			dup(p[0]);
@@ -1200,6 +1191,16 @@ main(int argc, char *argv[])
 			err(1, "cannot find dc");
 		}
 	}
+	if (interactive) {
+		el = el_init("bc", stdin, stderr, stderr);
+		hist = history_init();
+		history(hist, &he, H_SETSIZE, 100);
+		el_set(el, EL_HIST, history, hist);
+		el_set(el, EL_EDITOR, "emacs");
+		el_set(el, EL_SIGNAL, 1);
+		el_set(el, EL_PROMPT, dummy_prompt);
+		el_source(el, NULL);
+	}
 	yywrap();
 	return (yyparse());
 }

Modified: stable/9/usr.bin/dc/bcode.c
==============================================================================
--- stable/9/usr.bin/dc/bcode.c	Sun Mar 18 13:54:57 2012	(r233118)
+++ stable/9/usr.bin/dc/bcode.c	Sun Mar 18 14:49:36 2012	(r233119)
@@ -693,7 +693,7 @@ count_digits(const struct number *n)
 	u_int i;
 
 	if (BN_is_zero(n->number))
-		return (1);
+		return (n->scale ? n->scale : 1);
 
 	int_part = new_number();
 	fract_part = new_number();



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201203181449.q2IEnanM023678>