#include "apl.h" clear() { register struct nlist *n; extern freelist[]; for(n=nlist; n->namep; n++) { n->itemp = 0; n->use = 0; n->namep = 0; } freelist[0] = 0; freelist[1] = -1; /*empty free list*/ /* brk(memstart); /*shrink core*/ stack = sp = 0; Reset(); } lsize(s) char *s; { register short i; register char *p; i=1; p=s; while (*p++) i++; return(i); } isize(ip) struct item *ip; { register struct item *p; register i; p=ip; i=sizeof *p + p->rank*SINT; if(p->type == DA) i += p->size*SDAT; else if(p->type == CH) i += p->size; return(i); } wsload(ffile) { long b [ 256 ]; int ibuf, obuf; char name[NAMS]; short iz; long vmagic[1]; register i; register struct nlist *n; register struct item *p; char ch[1]; iz = 0; ibuf = ffile; /* ibuf[1] = ibuf[2] = 0;*/ /* Check for correct magic number */ read(ibuf,vmagic,4); if(vmagic[0] != (long)MAGIC) { close(ffile); error("not a ws"); } read(ibuf,&thread,sizeof thread); while(read(ibuf,&iz,2) == 2) { i = iz.c[1]; /* read name of vbl or fn */ read(ibuf,name,i); for(n=nlist; n->namep; n++) if(equal(name,n->namep)) { erase(n); goto hokay; } n->namep = alloc(i); copy(CH,name,n->namep,i); hokay: n->use = iz.c[0]; n->type = LV; switch(n->use) { default: close(ffile); error("can not load ws"); case DA: read(ibuf,&iz,2); p=alloc(iz); read(ibuf,p,iz); p->label += ((int)p);/*make absolute*/ n->itemp = p; continue; case NF: case MF: case DF: n->itemp = 0; fstat(obuf=wfile,b); /*obuf[1] = obuf[2] = 0;*/ n->label=b[4]; lseek(wfile,b[4],0); do { read(ibuf,ch,1); write(obuf,ch,1); } while(ch[0] != '\0'); fflush(obuf); } } fdat(ffile); close(ffile); } wssave(ffile) { long vmagic[1]; short iz; int jfile,ibuf, obuf; register struct nlist *n; register i; register struct item *p; char c[1]; ibuf = jfile = dup(wfile); obuf = ffile; /* obuf[1] = obuf[2] = 0; */ vmagic[0] = (long)MAGIC; write(obuf,vmagic,4); /*putw(vmagic, obuf); */ write(obuf,&thread,sizeof thread); for(n=nlist; n->namep; n++) { if(n->use == 0 || (n->use == DA && n->itemp == 0)) continue; iz.c[0] = n->use; i= lsize(n->namep); iz.c[1] = (char)i ; write(obuf,&iz,2); write(obuf,n->namep,i); switch(n->use) { default: close(ffile); close(jfile); error("save B"); case DA: p = n->itemp; i = isize(p); iz = (short) i; p -> label -= ((int)p); write(obuf,&iz,2); write(obuf,p,i); p->label += ((int)p); continue; case NF: case MF: case DF: lseek(ibuf,n->label,0); /* ibuf[1] = ibuf[2] = 0; */ do { read(ibuf,c,1); write(obuf,c,1); } while (c[0] != '\0') ; } } fflush(obuf); fdat(ffile); close(ffile); close(jfile); }; listdir() { register f; struct { short in; char nam[14]; } dir; if((f = open(".",0)) < 0) error("directory B"); while(read(f,&dir,sizeof dir) == sizeof dir) if(dir.in != 0 && dir.nam[0] != '.') { if(column+10 >= thread.width){ aprintf("\n\t"); } aprintf(dir.nam); aputchar('\t'); } aputchar('\n'); close(f); } fdat(f) { long b [ 256 ] ; register long *p; fstat(f,b); p = localtime(&b[7]); aprintf(" "); pr2d(p[2]); aputchar('.'); pr2d(p[1]); aputchar('.'); pr2d(p[0]); aputchar(' '); pr2d(p[4]+1); aputchar('/'); pr2d(p[3]); aputchar('/'); pr2d(p[5]); } pr2d(i) long i; { aputchar(i/10+'0'); aputchar(i % 10 + '0'); }