summaryrefslogtreecommitdiffstats
path: root/usr.bin/bc
diff options
context:
space:
mode:
authorkevlo <kevlo@FreeBSD.org>2012-03-15 01:43:44 +0000
committerkevlo <kevlo@FreeBSD.org>2012-03-15 01:43:44 +0000
commit7e61ff80de94738c6951b8b54683c55ea157f528 (patch)
treee0408089373c811a6b82408bd767961962ab1a14 /usr.bin/bc
parent0e6c83a1b6b87a39b461e832ccb815fd2aa4ee76 (diff)
downloadFreeBSD-src-7e61ff80de94738c6951b8b54683c55ea157f528.zip
FreeBSD-src-7e61ff80de94738c6951b8b54683c55ea157f528.tar.gz
- 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>
Diffstat (limited to 'usr.bin/bc')
-rw-r--r--usr.bin/bc/bc.library30
-rw-r--r--usr.bin/bc/bc.y23
2 files changed, 32 insertions, 21 deletions
diff --git a/usr.bin/bc/bc.library b/usr.bin/bc/bc.library
index c3145ab..d0b3df8 100644
--- a/usr.bin/bc/bc.library
+++ b/usr.bin/bc/bc.library
@@ -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: */
diff --git a/usr.bin/bc/bc.y b/usr.bin/bc/bc.y
index b00d5ac..55df7b3 100644
--- a/usr.bin/bc/bc.y
+++ b/usr.bin/bc/bc.y
@@ -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());
}
OpenPOWER on IntegriCloud