BSD 4 development
[unix-history] / usr / src / cmd / apl / ak.c
CommitLineData
957bb13d
BJ
1#include "apl.h"
2
3ex_scn0()
4{
5 fetch1();
6 scan0(0);
7}
8
9ex_scan()
10{
11 register struct item *p;
12
13 p = fetch1();
14 scan0(p->rank-1);
15}
16
17ex_scnk()
18{
19 register i;
20
21 i = topfix() - thread.iorg;
22 scan0(i);
23}
24
25scan0(k)
26{
27 register struct item *p, *q;
28 int param[2];
29 int scan1();
30
31 p = fetch1();
32 if(p->type != DA)
33 error("scan T");
34
35 bidx(p);
36 colapse(k);
37 if(idx.dimk == 0) {
38/*
39 * scan identities - ets/jrl 5/76
40 */
41 q = newdat(DA,0,1);
42 q->dim[0] = 1;
43 switch(*pcp++) {
44 case ADD:
45 case SUB:
46 case OR:
47 q->datap[0] = 0;
48 break;
49 case AND:
50 case MUL:
51 case DIV:
52 q->datap[0] = 1;
53 break;
54 case MIN:
55 q->datap[0] = 1.0e38;
56 break;
57 case MAX:
58 q->datap[0] = -1.0e38;
59 break;
60 default:
61 error("reduce identity");
62 }
63 pop();
64 push(q);
65 return;
66 }
67 param[0] = p->datap;
68 param[1] = exop[*pcp++];
69 forloop(scan1, param);
70}
71
72scan1(param)
73int param[];
74{
75 register i;
76 register data *dp;
77 data d;
78 data (*f)();
79
80 dp = param[0];
81 f = param[1];
82 dp =+ access();
83 d = *dp;
84 for(i = 1; i < idx.dimk; i++) {
85 dp =+ idx.delk;
86 *dp = d = (*f)(*dp, d);
87 }
88}
89
90data scalex 453.;
91data scaley 453.;
92data origx 0.0;
93data origy 0.0;
94
95ex_plot()
96{
97 register struct item *p;
98 register data *dp;
99 register i;
100 int ic;
101 int x, y;
102
103 p = fetch1();
104 if(p->type != DA)
105 error("plot T");
106 if(p->rank != 2)
107 error("plot R");
108 if(p->dim[1] != 2)
109 error("plot C");
110
111 dp = p->datap;
112 if ((i = p->dim[0]) == 0) return;
113 ic=0;
114 while(i--) {
115 x = scalex*(*dp++ - origx);
116 y = 454-(scaley*(*dp++ - origy));
117 if(x<0 || x >= 576 ||
118 y<0 || y>=454)
119 error("plot off screen");
120 if(ic)
121 line(x,y);
122 else {
123 move(x,y);
124 ic=1;
125 }
126 }
127}