BSD 3 development
[unix-history] / usr / src / cmd / apl / a9.c
#include "apl.h"
ex_dibm()
{
int inde, fsize;
char fname[128];
register i;
register char *a, *b;
inde = topfix();
a = fetch1();
if(a->type!=CH) {
if(a->size==0||a->size==1&&fuzz(*a->datap,0.0)==0) {
push(newdat(DA,1,0));
switch(inde) {
case 1:
if(i=ifile)
close(i);
ifile = 0;
return;
case 2:
case 3:
if((i=ofile)&&i!=1)
close(i);
ofile = 1;
return;
default:
error("mibm D");
}
}
error("mibm T");
}
if(a->rank!=1)
error("dibm R");
if(!(1<=a->size&&a->size<128))
error("fnam L");
fsize = a->size;
b = a->datap;
a = fname;
for(i=0; i<fsize; ++i)
*a++ = *b++;
*a = '\0';
push(newdat(DA,1,0));
switch(inde) {
case 1: /* Open for reading */
if(i=ifile)
close(i);
if((i=open(fname,0))<0)
goto badfile;
ifile = i;
return;
case 2: /* Open for writing */
if((i=ofile)&&i!=1)
close(i);
if((i=creat(fname,0666))<0)
goto badfile;
ofile = i;
return;
case 3: /* Open and append */
if((i=ofile)&&i!=1)
close(i);
if((i=open(fname,1))<0)
if((i=creat(fname,0666))<0)
goto badfile;
lseek(i, 0, 2);
ofile = i;
return;
case 10: {
int shellpid, oldsignal, termproc;
oldsignal = signal(2, 1);
if(!(shellpid=vfork()))
execl(getenv("SHELL") ? getenv("SHELL") : "/bin/sh", "sh", "-c", fname, 0);
else
while((termproc=wait(&termproc))!=-1)
if(termproc==shellpid)
break;
signal(2, oldsignal);
return;
}
default:
error("dibm unk");
}
badfile:
error("bad file");
}
ex_mibm()
{
register *p;
int t[6];
switch(topfix()) {
default:
error("ib unk");
case 1:
sclr();
datum = 0;
break;
case 20: /* time of day */
time(t);
p = t;
goto tod;
case 21: /* CPU time */
times(t);
t[3] = t[0];
t[0] = 0;
t[2] = 0;
datum = ltod(t) + ltod(t+2);
break;
case 22: /* Ws free */ /* RH 24-Apr-78 UCSF */
{
struct freeblk {
unsigned size;
struct freeblk *nxtblk;
};
extern int freelist[], sbrk();
register struct freeblk *runthru = freelist;
register unsigned int freesum = 0160000;
freesum -= sbrk(0);
while(runthru->nxtblk!=-1) {
freesum += runthru->size;
runthru = runthru->nxtblk;
}
datum = freesum + runthru->size;
}
break;
case 24: /* starting time */
p = stime;
tod:
p = localtime(p);
datum = 60.*(p[0]+60.*(p[1]+60.*p[2]));
break;
case 25: /* date */
time(t);
p = t;
goto dt;
/*
* non standard I functions
*/
case 28: /* starting date */
p = stime;
dt:
p = localtime(p);
datum = p[5]+100.*(p[3]+100.*(p[4]+1));
break;
case 29: /* iorg */
datum = thread.iorg;
break;
case 30: /* width */
datum = thread.width;
break;
case 31: /* digits */
datum = thread.digits;
break;
case 32:
{
int shellpid, oldsignal, termproc;
oldsignal = signal(2, 1);
if(!(shellpid=fork()))
execl("/bin/csh","-",0);
else
while((termproc=wait(&termproc))!=-1)
if(termproc==shellpid)
break;
signal(2, oldsignal);
push(newdat(DA,1,0));
return;
}
}
p = newdat(DA, 0, 1);
p->datap[0] = datum;
push(p);
}