V10/cmd/basic/basic/list.c

Compare this file to the similar file:
Show the results in this format:

/*	"@(#) 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);
}