BSD 4 development
[unix-history] / usr / src / cmd / apl / ac.c
CommitLineData
957bb13d
BJ
1#include "apl.h"
2
3ex_rot0()
4{
5
6 fetch2();
7 rotk(0);
8}
9
10ex_rotk()
11{
12 register k;
13
14 k = topfix() - thread.iorg;
15 fetch2();
16 rotk(k);
17}
18
19ex_rot()
20{
21 register struct item *p;
22
23 fetch2();
24 p = sp[-2];
25 rotk(p->rank-1);
26}
27
28rotk(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
53rot1(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}