BSD 4 development
[unix-history] / usr / src / cmd / apl / aj.c
CommitLineData
b832b584
BJ
1#include "apl.h"
2
3clear()
4{
5 register struct nlist *n;
6 extern freelist[];
7
8 for(n=nlist; n->namep; n++) {
9 n->itemp = 0;
10 n->use = 0;
11 n->namep = 0;
12 }
13 freelist[0] = 0;
14 freelist[1] = -1; /*empty free list*/
15 /* brk(memstart); /*shrink core*/
16 stack = sp = 0;
17 Reset();
18}
19
20lsize(s)
21char *s;
22{
23 register short i;
24 register char *p;
25
26 i=1;
27 p=s;
28 while (*p++) i++;
29 return(i);
30}
31
32isize(ip)
33struct item *ip;
34{
35 register struct item *p;
36 register i;
37
38 p=ip;
39 i=sizeof *p + p->rank*SINT;
40 if(p->type == DA)
41 i += p->size*SDAT; else
42 if(p->type == CH)
43 i += p->size;
44 return(i);
45}
46
47wsload(ffile)
48{
49 long b [ 256 ];
50 int ibuf, obuf;
51 char name[NAMS];
52 short iz;
53 long vmagic[1];
54 register i;
55 register struct nlist *n;
56 register struct item *p;
57 char ch[1];
58
59 iz = 0;
60 ibuf = ffile;
61 /* ibuf[1] = ibuf[2] = 0;*/
62/* Check for correct magic number */
63 read(ibuf,vmagic,4);
64 if(vmagic[0] != (long)MAGIC) {
65 close(ffile);
66 error("not a ws");
67 }
68 read(ibuf,&thread,sizeof thread);
69 while(read(ibuf,&iz,2) == 2) {
70 i = iz.c[1];
71/* read name of vbl or fn */
72 read(ibuf,name,i);
73 for(n=nlist; n->namep; n++)
74 if(equal(name,n->namep)) {
75 erase(n);
76 goto hokay;
77 }
78 n->namep = alloc(i);
79 copy(CH,name,n->namep,i);
80hokay:
81 n->use = iz.c[0];
82 n->type = LV;
83 switch(n->use) {
84 default:
85 close(ffile);
86 error("can not load ws");
87 case DA:
88 read(ibuf,&iz,2);
89 p=alloc(iz);
90 read(ibuf,p,iz);
91 p->label += ((int)p);/*make absolute*/
92 n->itemp = p;
93 continue;
94 case NF:
95 case MF:
96 case DF:
97 n->itemp = 0;
98 fstat(obuf=wfile,b);
99 /*obuf[1] = obuf[2] = 0;*/
100 n->label=b[4];
101 lseek(wfile,b[4],0);
102 do {
103 read(ibuf,ch,1);
104 write(obuf,ch,1);
105 } while(ch[0] != '\0');
106 fflush(obuf);
107 }
108 }
109 fdat(ffile);
110 close(ffile);
111}
112
113wssave(ffile)
114{ long vmagic[1];
115 short iz;
116 int jfile,ibuf, obuf;
117 register struct nlist *n;
118 register i;
119 register struct item *p;
120 char c[1];
121
122 ibuf = jfile = dup(wfile);
123 obuf = ffile;
124 /* obuf[1] = obuf[2] = 0; */
125 vmagic[0] = (long)MAGIC;
126 write(obuf,vmagic,4);
127 /*putw(vmagic, obuf); */
128 write(obuf,&thread,sizeof thread);
129
130 for(n=nlist; n->namep; n++) {
131 if(n->use == 0 || (n->use == DA && n->itemp == 0))
132 continue;
133 iz.c[0] = n->use;
134 i= lsize(n->namep);
135 iz.c[1] = (char)i ;
136 write(obuf,&iz,2);
137 write(obuf,n->namep,i);
138
139 switch(n->use) {
140 default:
141 close(ffile);
142 close(jfile);
143 error("save B");
144 case DA:
145 p = n->itemp;
146 i = isize(p);
147 iz = (short) i;
148 p -> label -= ((int)p);
149 write(obuf,&iz,2);
150 write(obuf,p,i);
151 p->label += ((int)p);
152 continue;
153 case NF:
154 case MF:
155 case DF:
156 lseek(ibuf,n->label,0);
157 /* ibuf[1] = ibuf[2] = 0; */
158 do {
159 read(ibuf,c,1);
160 write(obuf,c,1);
161 } while (c[0] != '\0') ;
162 }
163 }
164 fflush(obuf);
165 fdat(ffile);
166 close(ffile);
167 close(jfile);
168};
169
170listdir()
171{
172 register f;
173 struct {
174 short in;
175 char nam[14];
176 } dir;
177
178 if((f = open(".",0)) < 0)
179 error("directory B");
180 while(read(f,&dir,sizeof dir) == sizeof dir)
181 if(dir.in != 0 && dir.nam[0] != '.') {
182 if(column+10 >= thread.width){
183 aprintf("\n\t");
184 }
185 aprintf(dir.nam);
186 aputchar('\t');
187 }
188 aputchar('\n');
189 close(f);
190}
191
192fdat(f)
193{
194 long b [ 256 ] ;
195 register long *p;
196 fstat(f,b);
197 p = localtime(&b[7]);
198 aprintf(" ");
199 pr2d(p[2]);
200 aputchar('.');
201 pr2d(p[1]);
202 aputchar('.');
203 pr2d(p[0]);
204 aputchar(' ');
205 pr2d(p[4]+1);
206 aputchar('/');
207 pr2d(p[3]);
208 aputchar('/');
209 pr2d(p[5]);
210}
211
212pr2d(i)
213long i;
214{
215 aputchar(i/10+'0');
216 aputchar(i % 10 + '0');
217}