bc: do not check for errors when parsing/running internal library
function old new delta bc_lib_name 4 - -4 bc_vm_run 1921 1900 -21 ------------------------------------------------------------------------------ (add/remove: 0/1 grow/shrink: 0/1 up/down: 0/-25) Total: -25 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
24fb2cd62f
commit
0ad36c46c7
370
miscutils/bc.c
370
miscutils/bc.c
@ -915,185 +915,6 @@ static const BcNumBinaryOp bc_program_ops[] = {
|
||||
|
||||
static const char bc_program_stdin_name[] = "<stdin>";
|
||||
|
||||
#if ENABLE_BC
|
||||
static const char *bc_lib_name = "gen/lib.bc";
|
||||
|
||||
static const char bc_lib[] = {
|
||||
"scale=20"
|
||||
"\n" "define e(x){"
|
||||
"\n" "auto b,s,n,r,d,i,p,f,v"
|
||||
"\n" "b=ibase"
|
||||
"\n" "ibase=A"
|
||||
"\n" "if(x<0){"
|
||||
"\n" "n=1"
|
||||
"\n" "x=-x"
|
||||
"\n" "}"
|
||||
"\n" "s=scale"
|
||||
"\n" "r=6+s+0.44*x"
|
||||
"\n" "scale=scale(x)+1"
|
||||
"\n" "while(x>1){"
|
||||
"\n" "d+=1"
|
||||
"\n" "x/=2"
|
||||
"\n" "scale+=1"
|
||||
"\n" "}"
|
||||
"\n" "scale=r"
|
||||
"\n" "r=x+1"
|
||||
"\n" "p=x"
|
||||
"\n" "f=v=1"
|
||||
"\n" "for(i=2;v!=0;++i){"
|
||||
"\n" "p*=x"
|
||||
"\n" "f*=i"
|
||||
"\n" "v=p/f"
|
||||
"\n" "r+=v"
|
||||
"\n" "}"
|
||||
"\n" "while((d--)!=0)r*=r"
|
||||
"\n" "scale=s"
|
||||
"\n" "ibase=b"
|
||||
"\n" "if(n!=0)return(1/r)"
|
||||
"\n" "return(r/1)"
|
||||
"\n" "}"
|
||||
"\n" "define l(x){"
|
||||
"\n" "auto b,s,r,p,a,q,i,v"
|
||||
"\n" "b=ibase"
|
||||
"\n" "ibase=A"
|
||||
"\n" "if(x<=0){"
|
||||
"\n" "r=(1-10^scale)/1"
|
||||
"\n" "ibase=b"
|
||||
"\n" "return(r)"
|
||||
"\n" "}"
|
||||
"\n" "s=scale"
|
||||
"\n" "scale+=6"
|
||||
"\n" "p=2"
|
||||
"\n" "while(x>=2){"
|
||||
"\n" "p*=2"
|
||||
"\n" "x=sqrt(x)"
|
||||
"\n" "}"
|
||||
"\n" "while(x<=0.5){"
|
||||
"\n" "p*=2"
|
||||
"\n" "x=sqrt(x)"
|
||||
"\n" "}"
|
||||
"\n" "r=a=(x-1)/(x+1)"
|
||||
"\n" "q=a*a"
|
||||
"\n" "v=1"
|
||||
"\n" "for(i=3;v!=0;i+=2){"
|
||||
"\n" "a*=q"
|
||||
"\n" "v=a/i"
|
||||
"\n" "r+=v"
|
||||
"\n" "}"
|
||||
"\n" "r*=p"
|
||||
"\n" "scale=s"
|
||||
"\n" "ibase=b"
|
||||
"\n" "return(r/1)"
|
||||
"\n" "}"
|
||||
"\n" "define s(x){"
|
||||
"\n" "auto b,s,r,n,a,q,i"
|
||||
"\n" "b=ibase"
|
||||
"\n" "ibase=A"
|
||||
"\n" "s=scale"
|
||||
"\n" "scale=1.1*s+2"
|
||||
"\n" "a=a(1)"
|
||||
"\n" "if(x<0){"
|
||||
"\n" "n=1"
|
||||
"\n" "x=-x"
|
||||
"\n" "}"
|
||||
"\n" "scale=0"
|
||||
"\n" "q=(x/a+2)/4"
|
||||
"\n" "x=x-4*q*a"
|
||||
"\n" "if(q%2!=0)x=-x"
|
||||
"\n" "scale=s+2"
|
||||
"\n" "r=a=x"
|
||||
"\n" "q=-x*x"
|
||||
"\n" "for(i=3;a!=0;i+=2){"
|
||||
"\n" "a*=q/(i*(i-1))"
|
||||
"\n" "r+=a"
|
||||
"\n" "}"
|
||||
"\n" "scale=s"
|
||||
"\n" "ibase=b"
|
||||
"\n" "if(n!=0)return(-r/1)"
|
||||
"\n" "return(r/1)"
|
||||
"\n" "}"
|
||||
"\n" "define c(x){"
|
||||
"\n" "auto b,s"
|
||||
"\n" "b=ibase"
|
||||
"\n" "ibase=A"
|
||||
"\n" "s=scale"
|
||||
"\n" "scale*=1.2"
|
||||
"\n" "x=s(2*a(1)+x)"
|
||||
"\n" "scale=s"
|
||||
"\n" "ibase=b"
|
||||
"\n" "return(x/1)"
|
||||
"\n" "}"
|
||||
"\n" "define a(x){"
|
||||
"\n" "auto b,s,r,n,a,m,t,f,i,u"
|
||||
"\n" "b=ibase"
|
||||
"\n" "ibase=A"
|
||||
"\n" "n=1"
|
||||
"\n" "if(x<0){"
|
||||
"\n" "n=-1"
|
||||
"\n" "x=-x"
|
||||
"\n" "}"
|
||||
"\n" "if(x==1){"
|
||||
"\n" "if(scale<65){"
|
||||
"\n" "return(.7853981633974483096156608458198757210492923498437764552437361480/n)"
|
||||
"\n" "}"
|
||||
"\n" "}"
|
||||
"\n" "if(x==.2){"
|
||||
"\n" "if(scale<65){"
|
||||
"\n" "return(.1973955598498807583700497651947902934475851037878521015176889402/n)"
|
||||
"\n" "}"
|
||||
"\n" "}"
|
||||
"\n" "s=scale"
|
||||
"\n" "if(x>.2){"
|
||||
"\n" "scale+=5"
|
||||
"\n" "a=a(.2)"
|
||||
"\n" "}"
|
||||
"\n" "scale=s+3"
|
||||
"\n" "while(x>.2){"
|
||||
"\n" "m+=1"
|
||||
"\n" "x=(x-.2)/(1+.2*x)"
|
||||
"\n" "}"
|
||||
"\n" "r=u=x"
|
||||
"\n" "f=-x*x"
|
||||
"\n" "t=1"
|
||||
"\n" "for(i=3;t!=0;i+=2){"
|
||||
"\n" "u*=f"
|
||||
"\n" "t=u/i"
|
||||
"\n" "r+=t"
|
||||
"\n" "}"
|
||||
"\n" "scale=s"
|
||||
"\n" "ibase=b"
|
||||
"\n" "return((m*a+r)/n)"
|
||||
"\n" "}"
|
||||
"\n" "define j(n,x){"
|
||||
"\n" "auto b,s,o,a,i,v,f"
|
||||
"\n" "b=ibase"
|
||||
"\n" "ibase=A"
|
||||
"\n" "s=scale"
|
||||
"\n" "scale=0"
|
||||
"\n" "n/=1"
|
||||
"\n" "if(n<0){"
|
||||
"\n" "n=-n"
|
||||
"\n" "if(n%2==1)o=1"
|
||||
"\n" "}"
|
||||
"\n" "a=1"
|
||||
"\n" "for(i=2;i<=n;++i)a*=i"
|
||||
"\n" "scale=1.5*s"
|
||||
"\n" "a=(x^n)/2^n/a"
|
||||
"\n" "r=v=1"
|
||||
"\n" "f=-x*x/4"
|
||||
"\n" "scale=scale+length(a)-scale(a)"
|
||||
"\n" "for(i=1;v!=0;++i){"
|
||||
"\n" "v=v*f/i/(n+i)"
|
||||
"\n" "r+=v"
|
||||
"\n" "}"
|
||||
"\n" "scale=s"
|
||||
"\n" "ibase=b"
|
||||
"\n" "if(o!=0)a=-a"
|
||||
"\n" "return(a*r/1)"
|
||||
"\n" "}"
|
||||
};
|
||||
#endif // ENABLE_BC
|
||||
|
||||
static void fflush_and_check(void)
|
||||
{
|
||||
fflush_all();
|
||||
@ -7147,6 +6968,183 @@ static BcStatus bc_vm_stdin(void)
|
||||
return s;
|
||||
}
|
||||
|
||||
#if ENABLE_BC
|
||||
static const char bc_lib[] = {
|
||||
"scale=20"
|
||||
"\n" "define e(x){"
|
||||
"\n" "auto b,s,n,r,d,i,p,f,v"
|
||||
"\n" "b=ibase"
|
||||
"\n" "ibase=A"
|
||||
"\n" "if(x<0){"
|
||||
"\n" "n=1"
|
||||
"\n" "x=-x"
|
||||
"\n" "}"
|
||||
"\n" "s=scale"
|
||||
"\n" "r=6+s+0.44*x"
|
||||
"\n" "scale=scale(x)+1"
|
||||
"\n" "while(x>1){"
|
||||
"\n" "d+=1"
|
||||
"\n" "x/=2"
|
||||
"\n" "scale+=1"
|
||||
"\n" "}"
|
||||
"\n" "scale=r"
|
||||
"\n" "r=x+1"
|
||||
"\n" "p=x"
|
||||
"\n" "f=v=1"
|
||||
"\n" "for(i=2;v!=0;++i){"
|
||||
"\n" "p*=x"
|
||||
"\n" "f*=i"
|
||||
"\n" "v=p/f"
|
||||
"\n" "r+=v"
|
||||
"\n" "}"
|
||||
"\n" "while((d--)!=0)r*=r"
|
||||
"\n" "scale=s"
|
||||
"\n" "ibase=b"
|
||||
"\n" "if(n!=0)return(1/r)"
|
||||
"\n" "return(r/1)"
|
||||
"\n" "}"
|
||||
"\n" "define l(x){"
|
||||
"\n" "auto b,s,r,p,a,q,i,v"
|
||||
"\n" "b=ibase"
|
||||
"\n" "ibase=A"
|
||||
"\n" "if(x<=0){"
|
||||
"\n" "r=(1-10^scale)/1"
|
||||
"\n" "ibase=b"
|
||||
"\n" "return(r)"
|
||||
"\n" "}"
|
||||
"\n" "s=scale"
|
||||
"\n" "scale+=6"
|
||||
"\n" "p=2"
|
||||
"\n" "while(x>=2){"
|
||||
"\n" "p*=2"
|
||||
"\n" "x=sqrt(x)"
|
||||
"\n" "}"
|
||||
"\n" "while(x<=0.5){"
|
||||
"\n" "p*=2"
|
||||
"\n" "x=sqrt(x)"
|
||||
"\n" "}"
|
||||
"\n" "r=a=(x-1)/(x+1)"
|
||||
"\n" "q=a*a"
|
||||
"\n" "v=1"
|
||||
"\n" "for(i=3;v!=0;i+=2){"
|
||||
"\n" "a*=q"
|
||||
"\n" "v=a/i"
|
||||
"\n" "r+=v"
|
||||
"\n" "}"
|
||||
"\n" "r*=p"
|
||||
"\n" "scale=s"
|
||||
"\n" "ibase=b"
|
||||
"\n" "return(r/1)"
|
||||
"\n" "}"
|
||||
"\n" "define s(x){"
|
||||
"\n" "auto b,s,r,n,a,q,i"
|
||||
"\n" "b=ibase"
|
||||
"\n" "ibase=A"
|
||||
"\n" "s=scale"
|
||||
"\n" "scale=1.1*s+2"
|
||||
"\n" "a=a(1)"
|
||||
"\n" "if(x<0){"
|
||||
"\n" "n=1"
|
||||
"\n" "x=-x"
|
||||
"\n" "}"
|
||||
"\n" "scale=0"
|
||||
"\n" "q=(x/a+2)/4"
|
||||
"\n" "x=x-4*q*a"
|
||||
"\n" "if(q%2!=0)x=-x"
|
||||
"\n" "scale=s+2"
|
||||
"\n" "r=a=x"
|
||||
"\n" "q=-x*x"
|
||||
"\n" "for(i=3;a!=0;i+=2){"
|
||||
"\n" "a*=q/(i*(i-1))"
|
||||
"\n" "r+=a"
|
||||
"\n" "}"
|
||||
"\n" "scale=s"
|
||||
"\n" "ibase=b"
|
||||
"\n" "if(n!=0)return(-r/1)"
|
||||
"\n" "return(r/1)"
|
||||
"\n" "}"
|
||||
"\n" "define c(x){"
|
||||
"\n" "auto b,s"
|
||||
"\n" "b=ibase"
|
||||
"\n" "ibase=A"
|
||||
"\n" "s=scale"
|
||||
"\n" "scale*=1.2"
|
||||
"\n" "x=s(2*a(1)+x)"
|
||||
"\n" "scale=s"
|
||||
"\n" "ibase=b"
|
||||
"\n" "return(x/1)"
|
||||
"\n" "}"
|
||||
"\n" "define a(x){"
|
||||
"\n" "auto b,s,r,n,a,m,t,f,i,u"
|
||||
"\n" "b=ibase"
|
||||
"\n" "ibase=A"
|
||||
"\n" "n=1"
|
||||
"\n" "if(x<0){"
|
||||
"\n" "n=-1"
|
||||
"\n" "x=-x"
|
||||
"\n" "}"
|
||||
"\n" "if(x==1){"
|
||||
"\n" "if(scale<65){"
|
||||
"\n" "return(.7853981633974483096156608458198757210492923498437764552437361480/n)"
|
||||
"\n" "}"
|
||||
"\n" "}"
|
||||
"\n" "if(x==.2){"
|
||||
"\n" "if(scale<65){"
|
||||
"\n" "return(.1973955598498807583700497651947902934475851037878521015176889402/n)"
|
||||
"\n" "}"
|
||||
"\n" "}"
|
||||
"\n" "s=scale"
|
||||
"\n" "if(x>.2){"
|
||||
"\n" "scale+=5"
|
||||
"\n" "a=a(.2)"
|
||||
"\n" "}"
|
||||
"\n" "scale=s+3"
|
||||
"\n" "while(x>.2){"
|
||||
"\n" "m+=1"
|
||||
"\n" "x=(x-.2)/(1+.2*x)"
|
||||
"\n" "}"
|
||||
"\n" "r=u=x"
|
||||
"\n" "f=-x*x"
|
||||
"\n" "t=1"
|
||||
"\n" "for(i=3;t!=0;i+=2){"
|
||||
"\n" "u*=f"
|
||||
"\n" "t=u/i"
|
||||
"\n" "r+=t"
|
||||
"\n" "}"
|
||||
"\n" "scale=s"
|
||||
"\n" "ibase=b"
|
||||
"\n" "return((m*a+r)/n)"
|
||||
"\n" "}"
|
||||
"\n" "define j(n,x){"
|
||||
"\n" "auto b,s,o,a,i,v,f"
|
||||
"\n" "b=ibase"
|
||||
"\n" "ibase=A"
|
||||
"\n" "s=scale"
|
||||
"\n" "scale=0"
|
||||
"\n" "n/=1"
|
||||
"\n" "if(n<0){"
|
||||
"\n" "n=-n"
|
||||
"\n" "if(n%2==1)o=1"
|
||||
"\n" "}"
|
||||
"\n" "a=1"
|
||||
"\n" "for(i=2;i<=n;++i)a*=i"
|
||||
"\n" "scale=1.5*s"
|
||||
"\n" "a=(x^n)/2^n/a"
|
||||
"\n" "r=v=1"
|
||||
"\n" "f=-x*x/4"
|
||||
"\n" "scale=scale+length(a)-scale(a)"
|
||||
"\n" "for(i=1;v!=0;++i){"
|
||||
"\n" "v=v*f/i/(n+i)"
|
||||
"\n" "r+=v"
|
||||
"\n" "}"
|
||||
"\n" "scale=s"
|
||||
"\n" "ibase=b"
|
||||
"\n" "if(o!=0)a=-a"
|
||||
"\n" "return(a*r/1)"
|
||||
"\n" "}"
|
||||
};
|
||||
#endif // ENABLE_BC
|
||||
|
||||
static BcStatus bc_vm_exec(void)
|
||||
{
|
||||
BcStatus s = BC_STATUS_SUCCESS;
|
||||
@ -7155,15 +7153,19 @@ static BcStatus bc_vm_exec(void)
|
||||
#if ENABLE_BC
|
||||
if (option_mask32 & BC_FLAG_L) {
|
||||
|
||||
bc_lex_file(&G.prs.l, bc_lib_name);
|
||||
// We know that internal library is not buggy,
|
||||
// thus error checking is normally disabled.
|
||||
# define DEBUG_LIB 0
|
||||
bc_lex_file(&G.prs.l, "");
|
||||
s = bc_parse_text(&G.prs, bc_lib);
|
||||
if (DEBUG_LIB && s) return s;
|
||||
|
||||
while (!s && G.prs.l.t.t != BC_LEX_EOF)
|
||||
while (G.prs.l.t.t != BC_LEX_EOF) {
|
||||
s = G.prs.parse(&G.prs);
|
||||
|
||||
if (s) return s;
|
||||
if (DEBUG_LIB && s) return s;
|
||||
}
|
||||
s = bc_program_exec();
|
||||
if (s) return s;
|
||||
if (DEBUG_LIB && s) return s;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user