Mercurial > hg > jgplsrc
view f2.c @ 0:e0bbaa717f41 draft default tip
lol J
author | Jordi Gutiérrez Hermoso <jordigh@octave.org> |
---|---|
date | Mon, 25 Nov 2013 11:56:30 -0500 |
parents | |
children |
line wrap: on
line source
/* Copyright 1990-2011, Jsoftware Inc. All rights reserved. */ /* License in license.txt. */ /* */ /* Format: ": Dyad */ #include "j.h" static F2(jtth2box){A z;I n,p,q,*v,x,y; p=jt->pos[0]; q=jt->pos[1]; RZ(a=vi(a)); n=AN(a); v=AV(a); ASSERT(1>=AR(a),EVRANK); ASSERT(1==n||2==n,EVLENGTH); x=v[0]; y=2>n?0:v[1]; ASSERT(0<=x&&x<=2&&0<=y&&y<=2,EVDOMAIN); jt->pos[0]=x; jt->pos[1]=y; z=thorn1(w); jt->pos[0]=p; jt->pos[1]=q; R z; } static I jtc2j(J jt,B e,I m,C*zv){C c,*s,*t;I k,p; if(e&&(t=strchr(jt->th2buf,'e'))){ ++t; t+='-'==*t; k=0; while(c=*(k+t),c=='0'||c=='+')++k; if(k){ if(!c||' '==c){*t++='0'; --k;} while(*t=*(k+t))++t; p=m-(t-jt->th2buf); DO(p,*t++=' ';); if(0<=p)jt->th2buf[m]=0; }} t=jt->th2buf; k=strlen(t); if(!e&&(s=memchr(t,'-',k))){ /* turn -0 to 0 */ *s=' '; DO(k-(1+s-t), c=s[1+i]; if(c!='0'&&c!='.'){*s=CSIGN; break;}); if(!m&&' '==*s){++t; --k;} } if(m&&m<k)memset(zv,'*',m); else{ if(k<m){memset(zv+e*k,' ',m-k); if(!e)zv+=m-k;} DO(k, c=t[i]; *zv++='-'==c?CSIGN:c;); } R k; } /* c format to j format */ static B jtfmtex(J jt,I m,I d,I n,I*xv,B b,I c,I q,I ex){B bm=b||m;C*u,*v=jt->th2buf;I k; if(jt->th2bufn<20+d){A s; jt->th2bufn=20+d; GA(s,LIT,jt->th2bufn,1,0); v=jt->th2buf=CAV(s);} if(b)*v++='_'; else if(m)*v++=' '; *v++=' '; sprintf(v,FMTI,c); v+=q; k=(XBASEN+d+1-q)/XBASEN; k=MIN(n-1,k); DO(k, c=*--xv; sprintf(v,FMTI04,b?-c:c); v+=XBASEN;); k=v-jt->th2buf-(2+bm); if(k<d){memset(v,'0',d-k); v+=d-k;} else if(k>d&&(u=v=jt->th2buf+d+2+bm,'5'<=*v)){ while('9'==*--u); if(' '!=*u)++*u; else{*++u='1'; ++ex;} memset(u+1,'0',v-u-1); } jt->th2buf[bm]=jt->th2buf[bm+1]; jt->th2buf[bm+1]='.'; sprintf(v-!d,"e"FMTI"",ex); R 1; } /* format one extended integer in exponential form */ static B jtfmtx(J jt,B e,I m,I d,C*s,I t,X*wv){B b;C*v=jt->th2buf;I c,n,p,q,*xv;X x; x=*wv; n=AN(x); xv=AV(x)+n-1; c=*xv; b=0>c; if(b)c=-c; if(c==XPINF){if(b)*v++='_'; *v++='_'; *v=0; R 1;} q=c>999?4:c>99?3:c>9?2:1; p=q+XBASEN*(n-1); if(e)R fmtex(m,d,n,xv,b,c,q,p-1); else if(m&&m<b+p+d+!!d){memset(v,'*',m); v[m]=0;} else{ if(jt->th2bufn<4+p+d){A s; jt->th2bufn=4+p+d; GA(s,LIT,jt->th2bufn,1,0); v=jt->th2buf=CAV(s);} if(' '==*s)*v++=' '; if(b)*v++='_'; sprintf(v,FMTI,c); v+=q; DO(n-1, c=*--xv; sprintf(v,FMTI04,b?-c:c); v+=XBASEN;); if(d){*v++='.'; memset(v,'0',d); v[d]=0;} } R 1; } /* format one extended integer */ static B jtfmtq(J jt,B e,I m,I d,C*s,I t,Q*wv){B b;C*v=jt->th2buf;I c,ex=0,k,n,p,q,*xv;Q y;X a,g,x; y=*wv; x=y.n; c=XDIG(x); b=0>c; if(b)x=negate(x); if(c==XPINF||c==XNINF){if(e)*v++=' '; if(e>b)*v++=' '; if(b)*v++='_'; *v++='_'; *v=0; R 1;} RZ(a=xpow(xc(10L),xc(1+d))); if(e&&c&&0>xcompare(x,y.d)){ ex=XBASEN*(AN(y.n)-AN(y.d)); g=xtymes(x,xpow(xc(10L),xc(1+d-ex))); RZ(x=xdiv(g,y.d,XMFLR)); while(1==xcompare(a,x)){--ex; g=xtymes(xc(10L),g); RZ(x=xdiv(g,y.d,XMFLR));} if(b)x=negate(x); }else x=xdiv(xtymes(y.n,a),y.d,XMFLR); RZ(x=xdiv(xplus(x,xc(5L)),xc(10L),XMFLR)); n=AN(x); xv=AV(x)+n-1; c=*xv; b=0>c; if(b)c=-c; q=c>999?4:c>99?3:c>9?2:1; p=q+XBASEN*(n-1); if(c||!e)ex+=p-d-1; if(e)R fmtex(m,d,n,xv,b,c,q,ex); else if(m&&m<b+d+!!d+(0>ex?1:1+ex)){memset(v,'*',m); v[m]=0;} else{ if(jt->th2bufn<4+p+d){A s; jt->th2bufn=4+p+d; GA(s,LIT,jt->th2bufn,1,0); v=jt->th2buf=CAV(s);} if(' '==*s)*v++=' '; if(b)*v++='_'; if(0>ex){k=-ex-1; DO(1+MIN(d,k), *v++='0';);} sprintf(v,FMTI,c); v+=q; DO(n-1, c=*--xv; sprintf(v,FMTI04,b?-c:c); v+=XBASEN;); if(d){v[1]=0; DO(d, *v=*(v-1); --v;); *v='.';} } R 1; } /* format one rational number */ static void jtfmt1(J jt,B e,I m,I d,C*s,I t,C*wv){D y; switch(t){ case B01: sprintf(jt->th2buf,s,(D)*wv); break; case INT: sprintf(jt->th2buf,s,(D)*(I*)wv); break; case XNUM: fmtx(e,m,d,s,t,(X*)wv); break; case RAT: fmtq(e,m,d,s,t,(Q*)wv); break; default: y=*(D*)wv; y=y?y:0.0; /* -0 to 0 */ if (!memcmp(wv,&inf, SZD))strcpy(jt->th2buf,e?" _" :' '==*s?" _" :"_" ); else if(!memcmp(wv,&infm,SZD))strcpy(jt->th2buf,e?" __" :' '==*s?" __":"__"); else if(_isnan(*wv) )strcpy(jt->th2buf,e?" _.":' '==*s?" _.":"_."); else sprintf(jt->th2buf,s,y); }} /* format one number */ static void jtth2c(J jt,B e,I m,I d,C*s,I n,I t,I wk,C*wv,I zk,C*zv){ DO(n, fmt1(e,m,d,s,t,wv); c2j(e,m,zv); zv+=zk; wv+=wk;); } /* format a column */ static A jtth2a(J jt,B e,I m,I d,C*s,I n,I t,I wk,C*wv,B first){PROLOG;A y,z;B b=0;C*u,*yv,*zv;I i,m0=m,k,p,q; q=m?m:t&B01?3:t&INT?12:17; p=n*q; GA(z,LIT,p,2,0); *AS(z)=n; *(1+AS(z))=q; zv=CAV(z); if(m){th2c(e,m,d,s,n,t,wk,wv,m,zv); R z;} for(i=q=0;i<n;++i){ fmt1(e,m0,d,s,t,wv); while(p<q+(I)strlen(jt->th2buf)+1){RZ(z=over(z,z)); p+=p; zv=CAV(z);} u=q+zv; q+=k=c2j(e,0L,u); b=b||CSIGN==*u; zv[q++]=0; m=MAX(m,k); wv+=wk; } m+=!first; GA(y,LIT,n*m,2,0); *AS(y)=n; *(1+AS(y))=m; yv=CAV(y); memset(yv,' ',AN(y)); u=zv; if(e){yv+=!first; DO(n, q=strlen(u); MC(yv+(b&&CSIGN!=*u),u,q); yv+=m; u+=1+q;);} else {yv+=m; DO(n, q=strlen(u); MC(yv-q, u,q); yv+=m; u+=1+q;);} EPILOG(y); } /* like th2c, but allocates and returns array */ static B jtth2ctrl(J jt,A a,A*ep,A*mp,A*dp,A*sp,I*zkp){A da,ea,ma,s;B b=1,*ev,r; C*sv;D x,y;I an,*av,d,*dv,i,m,*mv,sk=15,zk=0;Z*au; r=!(CMPX&AT(a)); jt->th2bufn=500; if(r)RZ(a=cvt(INT,a)); an=AN(a); au=ZAV(a); av=AV(a); GA(ea,B01,an, 1,0); *ep=ea; ev=BAV(ea); GA(ma,INT,an, 1,0); *mp=ma; mv= AV(ma); GA(da,INT,an, 1,0); *dp=da; dv= AV(da); GA(s, LIT,an*sk,2,0); *sp=s; sv=CAV(s); *AS(s)=an; *(1+AS(s))=sk; for(i=0;i<an;++i){ if(r){m=av[i]; x=(D)m; d=0;} else{ x=au[i].re; m=(I)tfloor(x); ASSERT(teq(x,(D)m),EVDOMAIN); y=au[i].im; d=(I)tfloor(y); ASSERT(teq(y,(D)d),EVDOMAIN); if(0>y)x=-1; } if(0>m)m=-m; if(0>d)d=-d; ASSERT(0<=m&&0<=d,EVLIMIT); if(0<=x)sprintf(sv, "%%"FMTI"."FMTI"f", m,d); else sprintf(sv, m?"%%- "FMTI"."FMTI"e" :"%%-"FMTI"."FMTI"e", m?m-1:0,d+!!(SYS&SYS_PC)); sv+=sk; ev[i]=0>x; mv[i]=m; dv[i]=d; zk+=m; b=b&&m; if(jt->th2bufn<m)jt->th2bufn=m; if(jt->th2bufn<500+d)jt->th2bufn=500+d; } GA(s,LIT,jt->th2bufn,1,0); jt->th2buf=CAV(s); *zkp=b?zk:0; R 1; } /* parse format control (left argument of ":) */ F2(jtthorn2){PROLOG;A da,ea,h,ma,s,y,*yv,z;B e,*ev;C*sv,*wv,*zv;I an,c,d,*dv,k,m,*mv,n,r,sk,t,wk,*ws,zk; F2RANK(1,RMAX,jtthorn2,0); an=AN(a); t=AT(w); if(t&BOX)R th2box(a,w); ASSERT(t&NUMERIC&&!(t&SPARSE)&&!(AT(a)&SPARSE),EVDOMAIN); r=AR(w); ws=AS(w); c=r?ws[r-1]:1; n=c?AN(w)/c:prod(r-1,ws); ASSERT(!AR(a)||c==an,EVLENGTH); k=bp(t); wk=c*k; wv=CAV(w)-k; RZ(th2ctrl(a,&ea,&ma,&da,&s,&zk)); ev=BAV(ea); mv=AV(ma); dv=AV(da); sk=1<an?*(1+AS(s)):0; sv=CAV(s)-sk; if(zk||!AN(w)){ if(1==an)zk*=c; GA(z,LIT,n*zk,r?r:1,ws); *(AS(z)+AR(z)-1)=zk; zv=CAV(z); DO(c, if(i<an){e=ev[i]; m=mv[i]; d=dv[i];} th2c(e,m,d,sv+=sk,n,t,wk,wv+=k,zk,zv); zv+=m;); }else{ GA(y,BOX,c,1,0); yv=AAV(y); DO(c, if(i<an){e=ev[i]; m=mv[i]; d=dv[i];} RZ(yv[i]=th2a(e,m,d,sv+=sk,n,t,wk,wv+=k,(B)!i));); RZ(z=razeh(y)); if(2<r||1==n&&2!=r){ if(!r)r=1; RZ(h=vec(INT,r,ws)); *(AV(h)+r-1)=*(1+AS(z)); RZ(z=reshape(h,z)); }} EPILOG(z); }