BSD 3 development
[unix-history] / usr / src / cmd / apl / a4.c
CommitLineData
e7f61d3b
KT
1#include "apl.h"
2
3ex_asgn()
4{
5 register struct nlist *p;
6 register struct item *q;
7
8 p = sp[-1];
9 if(p->type == QD) {
10 pop();
11 ex_print();
12 return;
13 }
14 if(p->type == QC) {
15 pop();
16 ex_plot();
17 return;
18 }
19 if(p->type != LV)
20 error("asgn lv");
21 if(p->use != 0 && p->use != DA)
22 error("asgn var");
23 sp--;
24 q = fetch1();
25 erase(p);
26 p->use = DA;
27 p->itemp = q;
28 sp[-1] = p;
29}
30
31ex_elid()
32{
33
34 push(newdat(EL,0,0));
35}
36
37ex_index()
38{
39 register struct item *p;
40 struct item *q;
41 register i, j;
42 int f, n, lv;
43
44 n = *pcp++;
45 f = *pcp;
46 p = sp[-1];
47 if(f == ASGN) {
48 pcp++;
49 if(p->type != LV)
50 error("indexed assign value");
51 if(p->use != DA)
52 fetch1(); /* error("used before set"); */
53 q = p->itemp;
54 } else
55 q = fetch1();
56 if(q->rank != n)
57 error("subscript C");
58 idx.rank = 0;
59 for(i=0; i<n; i++) {
60 p = sp[-i-2];
61 if(p->type == EL) {
62 idx.dim[idx.rank++] =
63 q->dim[i];
64 continue;
65 }
66 p = fetch(p);
67 sp[-i-2] = p;
68 for(j=0; j<p->rank; j++)
69 idx.dim[idx.rank++] =
70 p->dim[j];
71 }
72 size();
73 if(f == ASGN) {
74 p = fetch(sp[-n-2]);
75 sp[-n-2] = p;
76 if(p->size > 1) {
77 if(idx.size != p->size)
78 error("assign C");
79 f = 1; /* v[i] <\b- v */
80 } else {
81 datum = getdat(p);
82 f = 2; /* v[i] <\b- s */
83 }
84 ex_elid();
85 } else {
86 p = newdat(q->type, idx.rank, idx.size);
87 copy(IN, idx.dim, p->dim, idx.rank);
88 push(p);
89 f = 0; /* v[i] */
90 }
91 bidx(q);
92 index1(0, f);
93 if(f == 0) {
94 p = sp[-1];
95 sp--;
96 for(i=0; i<=n; i++)
97 pop();
98 push(p);
99 } else {
100 sp -= 2;
101 for(i=0; i<n; i++)
102 pop();
103 }
104}
105
106index1(i, f)
107{
108 register struct item *p;
109 register j, k;
110
111 if(i >= idx.rank)
112 switch(f) {
113
114 case 0:
115 p = sp[-2];
116 p->index = access();
117 putdat(sp[-1], getdat(p));
118 return;
119
120 case 1:
121 datum = getdat(sp[-idx.rank-3]);
122
123 case 2:
124 p = sp[-2]->itemp;
125 p->index = access();
126 putdat(p, datum);
127 return;
128 }
129 p = sp[-i-3];
130 if(p->type == EL) {
131 for(j=0; j<idx.dim[i]; j++) {
132 idx.idx[i] = j;
133 index1(i+1, f);
134 }
135 return;
136 }
137 p->index = 0;
138 for(j=0; j<p->size; j++) {
139 k = fix(getdat(p)) - thread.iorg;
140 if(k < 0 || k > idx.dim[i])
141 error("subscript X");
142 idx.idx[i] = k;
143 index1(i+1, f);
144 }
145}