BSD 3 development
[unix-history] / usr / src / cmd / apl / aj.c
#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');
}