BSD 4_2 release
[unix-history] / usr / src / new / new / apl / src / aa.c
CommitLineData
0f4556f1 1static char Sccsid[] = "aa.c @(#)aa.c 1.1 10/1/82 Berkeley ";
3d5c0bc1
KT
2#include "apl.h"
3
4int gdu();
5int gdd();
6
7ex_gdu()
8{
9 register struct item *p;
10
11 p = fetch1();
12 gd0(p->rank-1, gdu);
13}
14
15ex_gduk()
16{
17 register k;
18
19 k = topfix() - thread.iorg;
20 fetch1();
21 gd0(k, gdu);
22}
23
24ex_gdd()
25{
26 register struct item *p;
27
28 p = fetch1();
29 gd0(p->rank-1, gdd);
30}
31
32ex_gddk()
33{
34 register k;
35
36 k = topfix() - thread.iorg;
37 fetch1();
38 gd0(k, gdd);
39}
40
41gd0(k, f)
42int (*f)();
43{
44 register struct item *p;
0f4556f1 45 char *param[2];
3d5c0bc1
KT
46 int gd1();
47
48 bidx(sp[-1]);
49 if(k < 0 || k >= idx.rank)
50 error("grade X");
51 p = newdat(DA, idx.rank, idx.size);
52 copy(IN, idx.dim, p->dim, idx.rank);
0f4556f1 53 *sp++ = p;
3d5c0bc1
KT
54 colapse(k);
55 param[0] = alloc(idx.dimk*SINT);
0f4556f1 56 param[1] = (char *)f;
3d5c0bc1 57 forloop(gd1, param);
0f4556f1 58 free(param[0]);
3d5c0bc1
KT
59 p = sp[-1];
60 sp--;
61 pop();
0f4556f1 62 *sp++ = p;
3d5c0bc1
KT
63}
64
65gd1(param)
0f4556f1 66int *param[];
3d5c0bc1
KT
67{
68 register struct item *p;
69 register i, *m;
70
71 integ = access();
72 m = param[0];
73 for(i=0; i<idx.dimk; i++)
74 *m++ = i;
75 m = param[0];
76 qsort(m, idx.dimk, SINT, param[1]);
77 p = sp[-1];
78 for(i=0; i<idx.dimk; i++) {
79 p->index = integ;
80 datum = *m++ + thread.iorg;
81 putdat(p, datum);
0f4556f1 82 integ += idx.delk;
3d5c0bc1
KT
83 }
84}
85
86gdu(p1, p2)
87int *p1, *p2;
88{
89 register struct item *p;
90 data d1, d2;
91
92 p = sp[-2];
93 p->index = integ + *p1 * idx.delk;
94 d1 = getdat(p);
95 p->index = integ + *p2 * idx.delk;
96 d2 = getdat(p);
97 if(fuzz(d1, d2) != 0) {
98 if(d1 > d2)
99 return(1);
100 return(-1);
101 }
102 return(*p1 - *p2);
103}
104
105gdd(p1, p2)
106int *p1, *p2;
107{
108 register struct item *p;
109 data d1, d2;
110
111 p = sp[-2];
112 p->index = integ + *p1 * idx.delk;
113 d1 = getdat(p);
114 p->index = integ + *p2 * idx.delk;
115 d2 = getdat(p);
116 if(fuzz(d1, d2) != 0) {
117 if(d1 > d2)
118 return(-1);
119 return(1);
120 }
121 return(*p1 - *p2);
122}