|
|
1.1 root 1: static char Sccsid[] = "aj.c @(#)aj.c 1.2 10/1/82 Berkeley ";
2: #include "apl.h"
3: #include <signal.h>
4:
5: #ifdef vax
6: #define WSMESG "can't load pdp-11 workspace"
7: #else
8: #define WSMESG "can't load vax workspace"
9: #endif
10:
11:
12: clear()
13: {
14: register struct nlist *n;
15:
16: for(n=nlist; n->namep; n++) {
17: n->use = 0;
18: n->itemp = 0;
19: n->namep = 0;
20: }
21: thread.iorg = 1;
22: srand(thread.rl = 1);
23: thread.width = 72;
24: thread.fuzz = 1.0e-13;
25: afreset(); /* release all dynamic memory */
26: gsip = 0; /* reset state indicator */
27: }
28:
29: lsize(s)
30: char *s;
31: {
32: register i;
33: register char *p;
34:
35: i=1;
36: p=s;
37: while (*p++) i++;
38: return(i);
39: }
40:
41: isize(ip)
42: struct item *ip;
43: {
44: register struct item *p;
45: register i;
46:
47: p=ip;
48: i = sizeof *p - (MRANK-p->rank)*SINT;
49: if(p->type == DA)
50: i += p->size*SDAT; else
51: if(p->type == CH)
52: i += p->size;
53: return(i);
54: }
55:
56: wsload(ffile)
57: {
58: struct item *convrt();
59: char name[NAMS];
60: union uci iz;
61: register i;
62: register struct nlist *n;
63: register struct item *p;
64: char c;
65: int dconv;
66: struct {
67: int word;
68: };
69:
70: iz.i = 0;
71: /* Check for correct magic number */
72: READF(ffile,&iz,sizeof iz);
73: iz.i &= 0177777; /* Zap high bits */
74: if((iz.i|1) != (MAGIC|1)){
75: barf:
76: CLOSEF(ffile);
77: if (((iz.i|1)^2) == (MAGIC|1))
78: error(WSMESG);
79: else
80: error("bad ws file format");
81: }
82: if(iz.i > MAGIC){
83: printf("single data converted to double\n");
84: dconv = 2;
85: } else if(iz.i < MAGIC){
86: printf("double data converted to single\n");
87: dconv = 1;
88: } else
89: dconv = 0;
90: READF(ffile,&thread,sizeof thread);
91: while(READF(ffile,&iz,sizeof iz) == sizeof iz){
92: i = iz.cv[1];
93: /* read name of vbl or fn */
94: READF(ffile,name,i);
95: for(n=nlist; n->namep; n++)
96: if(equal(name, n->namep)){
97: erase(n);
98: goto hokay;
99: }
100: n->namep = alloc(i);
101: copy(CH,name,n->namep,i);
102: hokay:
103: n->use = iz.cv[0];
104: n->type = LV;
105: switch(n->use) {
106: default:
107: goto barf;
108:
109: case DA:
110: READF(ffile,&iz,sizeof iz);
111: p=(struct item *)alloc(iz.i);
112: READF(ffile,p,iz.i);
113: p->datap = (data *)&p->dim[p->rank]; /*make absolute*/
114: /*
115: * convert data type if neccessary
116: */
117: n->itemp = convrt(dconv,p);
118: continue;
119: case NF:
120: case MF:
121: case DF:
122: n->itemp = 0;
123: n->label = SEEKF(wfile, 0L, 2);
124: do {
125: if(READF(ffile,&c,1) != 1)
126: error("wsload eof");
127: WRITEF(wfile,&c,1);
128: } while(c != 0);
129: }
130: }
131: fdat(ffile);
132: CLOSEF(ffile);
133: }
134:
135: wssave(ffile)
136: {
137: register struct nlist *n;
138:
139: nsave(ffile, 0);
140: for(n=nlist; n->namep; n++)
141: nsave(ffile, n);
142: fdat(ffile);
143: CLOSEF(ffile);
144: }
145:
146: vsave(fd)
147: {
148: register struct nlist *n;
149: struct nlist *getnm();
150:
151: nsave(fd, 0);
152: while(n = getnm())
153: nsave(fd, n);
154: fdat(fd);
155: CLOSEF(fd);
156: }
157:
158: nsave(ffile, an)
159: struct nlist *an;
160: {
161: union uci iz;
162: register struct nlist *n;
163: register i;
164: register struct item *p;
165: char c;
166:
167: n = an;
168: if(n == 0){
169: iz.i = MAGIC;
170: WRITEF(ffile,&iz,sizeof iz);
171: WRITEF(ffile,&thread,sizeof thread);
172: return(0);
173: }
174:
175: if(n->use == 0 || (n->use == DA && n->itemp == 0))
176: return(0);
177: iz.cv[0] = n->use;
178: iz.cv[1] = i = lsize(n->namep);
179: #ifdef vax
180: iz.cv[2] = iz.cv[3] = 0;
181: #endif
182: WRITEF(ffile,&iz,sizeof iz);
183: WRITEF(ffile,n->namep,i);
184:
185: switch(n->use) {
186: default:
187: CLOSEF(ffile);
188: error("save B");
189: case DA:
190: p = n->itemp;
191: iz.i = i = isize(p);
192: ((struct nlist *)p)->label -= (int)p;
193: WRITEF(ffile,&iz,sizeof iz);
194: WRITEF(ffile,p,i);
195: ((struct nlist *)p)->label += (int)p;
196: break;
197: case NF:
198: case MF:
199: case DF:
200: SEEKF(wfile,(long)n->label,0);
201: do {
202: READF(wfile,&c,1);
203: WRITEF(ffile,&c,1);
204: } while(c != 0);
205: }
206: return(0);
207: }
208:
209: struct nlist *
210: getnm()
211: {
212: char name[100];
213: register char *p;
214: register struct nlist *n;
215: register c;
216:
217: while(1){
218: printf("variable name? ");
219: c = READF(1, name, 100);
220: if(c <= 1)
221: return(0);
222: name[c-1] = 0;
223: for(n=nlist; n->namep; n++)
224: if(equal(name, n->namep))
225: return(n);
226: printf("%s does not exist\n", name);
227: }
228: }
229:
230: #ifdef NDIR
231: listdir()
232: {
233: register pid, i;
234: register int (*oldint)();
235:
236: /* I am not AT ALL happy with the change in the directory
237: * format. Until it settles down in an official 4.2BSD
238: * distribution, just bail out and call "ls". This solution
239: * doesn't work properly with ")script" files, but eventually
240: * I hope to make it internal again.
241: * --John Bruner (06-May-82)
242: */
243:
244: oldint = signal(SIGINT, SIG_IGN);
245: while ((pid=FORKF(1)) < 0)
246: sleep(5);
247: if (!pid) {
248: signal(SIGINT, SIG_DFL);
249: execl("/usr/ucb/ls", "ls", 0); /* for column output */
250: execl("/bin/ls", "ls", 0); /* last resort */
251: write(2, "Can't find \"ls\"!\n", 17);
252: exit(1);
253: }
254: while ((i=wait(0)) > 0 && i != pid);
255: signal(SIGINT, oldint);
256: }
257: #else
258: listdir()
259: {
260: register f;
261: register char *p;
262: struct direct dir;
263:
264: /* List the directory in columnar format. */
265:
266: if((f = OPENF(".",0)) < 0)
267: error("directory B");
268: while(READF(f,&dir,sizeof dir) == sizeof dir)
269: if(dir.d_ino != 0 && dir.d_name[0] != '.') {
270: if(column+10 >= thread.width)
271: printf("\n\t");
272: for(p=dir.d_name; p<dir.d_name+14 && *p; p++)
273: putchar(*p);
274: putchar('\t');
275: }
276: putchar('\n');
277: CLOSEF(f);
278: }
279: #endif
280:
281: fdat(f)
282: {
283: struct stat b;
284: register struct tm *p;
285: struct tm *localtime();
286:
287: FSTATF(f,&b);
288: p = localtime(&b.st_mtime);
289:
290: printf(" ");
291: pr2d(p->tm_hour);
292: putchar('.');
293: pr2d(p->tm_min);
294: putchar('.');
295: pr2d(p->tm_sec);
296: putchar(' ');
297: pr2d(p->tm_mon+1);
298: putchar('/');
299: pr2d(p->tm_mday);
300: putchar('/');
301: pr2d(p->tm_year);
302: }
303:
304: pr2d(i)
305: {
306: putchar(i/10+'0');
307: putchar(i % 10 + '0');
308: }
309:
310: struct item *
311: convrt(m, p)
312: struct item *p;
313: {
314: register i;
315: register float *f;
316: register double *d;
317: struct item *q;
318:
319: if (p->type == CH) return(p);
320: switch(m){
321: case 0:
322: return(p);
323:
324: case 1: /* apl to apl2 */
325: q = newdat(DA, p->rank, p->size);
326: f = (float *)q->datap;
327: d = (double *)p->datap;
328: for(i=0; i<p->size; i++)
329: *f++ = *d++;
330: break;
331:
332: case 2: /* apl2 to apl */
333: q = newdat(DA, p->rank, p->size);
334: f = (float *)p->datap;
335: d = (double *)q->datap;
336: for(i=0; i<p->size; i++)
337: *d++ = *f++;
338: break;
339: }
340: for(i=0; i<p->rank; i++)
341: q->dim[i] = p->dim[i];
342: free(p);
343: return(q);
344: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.