Commit | Line | Data |
---|---|---|
1ab0374e KT |
1 | #include "apl.h" |
2 | ||
3 | clear() | |
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 | ||
20 | lsize(s) | |
21 | char *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 | ||
32 | isize(ip) | |
33 | struct 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 | ||
47 | wsload(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); | |
80 | hokay: | |
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 | ||
113 | wssave(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 | ||
170 | listdir() | |
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 | ||
192 | fdat(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 | ||
212 | pr2d(i) | |
213 | long i; | |
214 | { | |
215 | aputchar(i/10+'0'); | |
216 | aputchar(i % 10 + '0'); | |
217 | } |