V10/cmd/basic/basic/list.c
/* "@(#) list.c: V 2.27 6/29/83" */
#include <stdio.h>
#include "bas.h"
#include "tokens.h"
UCHAR stpflg;
static FILE *fd = stdout;
stopl()
{
stpflg = 1;
preprint();
printf("\n%s %d\n","INTERRUPT LINE",inst.thing.linno);
fd = stdout;
signal(2,stopl);
}
extern int LLISTcmd,
inc;
extern LINNO line_number;
#define retrn(x) {signal(2,quit);\
if (llist && fd != stdout) pclose(fd);\
else if (fd != stdout) fclose(fd);\
fd=stdout;\
return(x);}
extern FILE *popen();
list()
{
LINNO start,
finish;
int delim,
llist = 0,
quit();
/* if there is no expression then list the
* entire program */
signal(2,stopl);
if (inst.thing.opcode == LLISTcmd)
llist = 1;
skip00(&expr);
if (*expr == ',')
{
if (getlistname() < 0)
retrn(-1);
expr = &nullstrng;
}
if (*expr == '\0')
{
if (fetch(FIRST,LINE,&lbdptr) < 0)
{
retrn(0);
}
if (llist)
{
if ((fd = popen("/usr/bin/lp","w")) == NULL)
{
error(inst.thing.linno,inst.thing.stmtno, 43);
retrn(-1);
}
}
prin();
while (fetch(NEXT,LINE,&lbdptr) == 0 && stpflg == 0)
prin();
retrn(0);
}
/* there is an expression so parse it into
* start and finish */
if (lnpars(&start, &finish, &delim, &expr) < 0)
return(-1);
if (finish == 0 && delim)
finish = MAXLINNO;
else if (finish == 0)
finish = start;
else if (finish < start)
{ /* start > finish */
error(inst.thing.linno,inst.thing.stmtno, 41);
retrn(-1);
}
skip00(&expr);
if (!llist && *expr != '\0' && getlistname() < 0)
retrn(-1);
if (fetch(start,LINE,&lbdptr) == -1)
{
retrn(0);
}
if (llist)
{
if ((fd = popen("/usr/bin/lp","w")) == NULL)
{
error(inst.thing.linno,inst.thing.stmtno, 43);
retrn(-1);
}
}
prin(); /* print the first line */
if (inst.thing.linno < finish)
while (fetch(NEXT,LINE,&lbdptr) == 0 && stpflg == 0)
{
if (inst.thing.linno > finish)
{
lbdptr = curptr;
retrn(0);
}
prin();
}
retrn(0);
}
getlistname()
{
if (*expr != ',')
{
error(inst.thing.linno,inst.thing.stmtno, 21);
return(-1);
}
++expr;
if (eval(expr) < 0)
return(-1);
if (exprtype != STRING)
{
error(inst.thing.linno,inst.thing.stmtno, 51);
return(-1);
}
if ((fd = fopen(exprval.sval,"w")) == NULL)
{
error(inst.thing.linno,inst.thing.stmtno, 2);
return(-1);
}
return(0);
}
/* print most recently FETCHed line */
prin()
{
char buf[LINMAX+1];
line_decode(curptr,buf);
prin1(buf);
return(0);
}
extern short startpos,
margin;
prin1(buf)
char *buf;
{
int i,
j;
j = strlen(buf);
for (i = 0; i < j; ++i)
{
if (startpos > margin)
{
putc('\n',fd);
startpos = 1;
}
putc(*(buf+i),fd);
if (*(buf+i) == '\n')
startpos = 1;
else
++startpos;
}
line_number = inst.thing.linno;
return(0);
}
extern struct FUNCTAB functab[];
extern char *keyword[];
expand(in,out)
char **in,
**out;
{
register char c;
int quoflg;
quoflg = 0;
c = *(*in)++;
while (c != '\0')
{
if (c == '"')
quoflg = quoflg ? 0 : 1;
if (((c & 0377) == 0377) && !quoflg) /* expand function name */
{
strcpy(*out, functab[(**in & 0377) - 1].name);
*out += strlen(*out);
(*in)++;
}
else if (((c & 0377) >= 0200) && !quoflg) /* expand keyword */
{
strcpy(*out, keyword[(c & 0377) - 0200]);
*out += strlen(*out);
}
else
*(*out)++ = c;
c = *(*in)++;
}
**out = '\0';
return(0);
}
/*
* parse line numbers of the form
*
* [start] - [finish]
*
*/
lnpars(x,y,delim,ptr)
LINNO *x,
*y;
int *delim;
char **ptr;
{
char buf[LINMAX+1];
*x = 0;
*y = 0;
*delim = 0;
switch (lex(ptr, buf))
{
case INTCONST:
if ((*x = atoln(buf)) == 0)
{
error(inst.thing.linno,inst.thing.stmtno, 89);
return(-1);
}
break;
case LDOT:
*x = line_number;
break;
case LMINUS:
*delim = 1;
goto secondnum;
default:
error(inst.thing.linno,inst.thing.stmtno, 39); /* no starting line # */
return(-1);
}
switch (lex(ptr, buf))
{
case 0:
break;
case LMINUS:
*delim = 1;
break;
default:
*ptr -= 1;
return(0);
}
secondnum:
switch (lex(ptr, buf))
{
case 0:
*y = 0;
break;
case LDOT:
*y = line_number;
break;
case INTCONST:
if ((*y = atoln(buf)) == 0)
{
error(inst.thing.linno,inst.thing.stmtno, 89);
return(-1);
}
break;
default:
*ptr -= 1;
break;
}
return(0);
}