|
|
1.1 root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.