- 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>
This commit is contained in:
parent
0e6c83a1b6
commit
7e61ff80de
@ -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: */
|
||||
|
@ -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());
|
||||
}
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user