Commit | Line | Data |
---|---|---|
957bb13d BJ |
1 | #include "apl.h" |
2 | ||
3 | ex_rot0() | |
4 | { | |
5 | ||
6 | fetch2(); | |
7 | rotk(0); | |
8 | } | |
9 | ||
10 | ex_rotk() | |
11 | { | |
12 | register k; | |
13 | ||
14 | k = topfix() - thread.iorg; | |
15 | fetch2(); | |
16 | rotk(k); | |
17 | } | |
18 | ||
19 | ex_rot() | |
20 | { | |
21 | register struct item *p; | |
22 | ||
23 | fetch2(); | |
24 | p = sp[-2]; | |
25 | rotk(p->rank-1); | |
26 | } | |
27 | ||
28 | rotk(k) | |
29 | { | |
30 | register struct item *p, *q; | |
31 | register param; | |
32 | int rot1(); | |
33 | ||
34 | p = sp[-1]; | |
35 | bidx(sp[-2]); | |
36 | if(k < 0 || k >= idx.rank) | |
37 | error("rotate X"); | |
38 | param = 0; | |
39 | colapse(k); | |
40 | if(idx.size != p->size) { | |
41 | if(p->size != 1) | |
42 | error("rotate C"); | |
43 | param++; | |
44 | datum = getdat(p); | |
45 | } | |
46 | p = newdat(idx.type, 1, idx.dimk); | |
47 | push(p); | |
48 | forloop(rot1, param); | |
49 | pop(); | |
50 | pop(); | |
51 | } | |
52 | ||
53 | rot1(param) | |
54 | { | |
55 | register struct item *p, *q; | |
56 | register i; | |
57 | int o, n; | |
58 | ||
59 | if(param == 0) | |
60 | datum = getdat(sp[-2]); | |
61 | o = fix(datum); | |
62 | if(o < 0) | |
63 | o = idx.dimk - (-o % idx.dimk); | |
64 | q = sp[-1]; | |
65 | p = sp[-3]; | |
66 | q->index = 0; | |
67 | n = access(); | |
68 | for(i=0; i<idx.dimk; i++) { | |
69 | p->index = n + (o%idx.dimk)*idx.delk; | |
70 | putdat(q, getdat(p)); | |
71 | o++; | |
72 | } | |
73 | for(i=0; i<idx.dimk; i++) { | |
74 | p->index = n; | |
75 | putdat(p, getdat(q)); | |
76 | n =+ idx.delk; | |
77 | } | |
78 | } |