-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathcr_t.h
70 lines (66 loc) · 2.15 KB
/
cr_t.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/* Copyright 1990-2011, Jsoftware Inc. All rights reserved. */
/* License in license.txt. */
/* */
/* cr.c templates */
/* template 0 used by the rank operator general cases (monad and dyad) */
/* requires: */
/* VALENCE 1 or 2 */
#if TEMPLATE==0
#if VALENCE==1
#define RCALL CALL1(f1,yw,fs)
#define RDIRECT (wt&DIRECT)
#define RAC (1==AC(yw))
#define RFLAG (!(AFLAG(w)&AFNJA+AFSMM+AFREL))
#define RARG {if(1<AC(yw))NEWYW; MOVEYW;}
#define RARGX {if(1<AC(yw)){RZ(yw=ca(yw)); vv=CAV(yw);}}
#else
#define RCALL CALL2(f2,ya,yw,fs)
#define RDIRECT (at&DIRECT&&wt&DIRECT)
#define RAC (1==AC(ya)&&1==AC(yw))
#define RFLAG (!(AFLAG(a)&AFNJA+AFSMM+AFREL)&&!(AFLAG(w)&AFNJA+AFSMM+AFREL))
#define RARG {++jj; if(!b||jj==n){if(1<AC(ya))NEWYA; MOVEYA;} \
if( b||jj==n){if(1<AC(yw))NEWYW; MOVEYW;} if(jj==n)jj=0;}
#define RARGX {if(1<AC(ya)){RZ(ya=ca(ya)); uu=CAV(ya);} \
if(1<AC(yw)){RZ(yw=ca(yw)); vv=CAV(yw);}}
#endif
{B cc=1;C*zv;I j=0,jj=0,old;
if(mn){y0=y=RCALL; RZ(y);}
else{I d;
d=jt->db; jt->db=0; y=RCALL; jt->db=d;
if(jt->jerr){y=zero; RESETERR;}
}
yt=AT(y); yr=AR(y); ys=AS(y); yn=AN(y); k=yn*bp(yt);
if(!mn||yt&DIRECT&&RFLAG){I zn;
RARGX; RE(zn=mult(mn,yn));
GA(z,yt,zn,p+yr,0L); ICPY(AS(z),s,p); ICPY(p+AS(z),ys,yr);
if(mn){zv=CAV(z); MC(zv,AV(y),k);}
old=jt->tbase+jt->ttop;
for(j=1;j<mn;++j){
RARG;
RZ(y=RCALL);
if(yt!=AT(y)||yr!=AR(y)||yr&&ICMP(AS(y),ys,yr))break;
MC(zv+=k,AV(y),k);
if(cc&&RAC)tpop(old); else cc=0;
}}
if(j<mn){A q,*x,yz;
jj=j%n;
GA(yz,BOX,mn,p,s); x=AAV(yz);
if(j){
zv=CAV(z)-k;
DO(j, GA(q,AT(y0),AN(y0),AR(y0),AS(y0)); MC(AV(q),zv+=k,k); *x++=q;);
}
*x++=y;
DO(mn-j-1, RARG; RZ(y=RCALL); *x++=y;);
z=ope(yz);
}
EPILOG(z);
}
#undef VALENCE
#undef RAC
#undef RARG
#undef RARGX
#undef RCALL
#undef RDIRECT
#undef RFLAG
#endif /* TEMPLATE 0 */
#undef TEMPLATE