#include <stdio.h>

#include "sysdep.h"
#include "output.h"
#include "express.h"
#include "mainloop.h"
#include "edit.h"
#include "udf.h"

extern int trace,nojump,booktype,promptnotebook;

void read_line (char *line)
{
	int count=0,input,scan;
	char *p;

start :
	p=line;
	while(1)
	{	input=getc(infile);
		if (input==EOF)
		{	fclose(infile);
			if (p>line) break;
			else *p++=1;
			infile=0;
			break;
		}
		if (input=='\r') {
			continue;
		}
		if (input=='\n') break;
		if (count>=1023)
		{	output("Line too long!\n"); error=50; *line=0; return;
		}
		if ((char)input>=' ' || (signed char)input<0
			|| (char)input==TAB)
		{	*p++=(char)input; count++;
		}
	}
	*p=0;
	if (booktype)
	{	switch (*line)
		{   case '$' :
			case '>' :
				output1("%s\n",line);
				if (promptnotebook && line[1]) wait_key(&scan);
				if (scan==escape)
				{	fclose(infile); infile=0; *line=0;
					break;
				}
				*line=' '; break;
			case '%' :
				output1("%s\n",line);
				goto start;
			default :
				if (!infile) break;
				goto start;
		}
	}
}

void next_line (void)
/**** next_line
	read a line from keyboard or file.
****/
{	if (udfon)
	{	while (*next) next++;
		next++;
		if (*next==1) udfon=0; else udfline=next;
		if (trace>0) trace_udfline(next);
		return;
	}
	else
	{	if (trace==-1) trace=1;
		if (stringon)
		{	error=2300; output("Input ended in string!\n");
			return;
		}
		nojump=0;
		if (!infile) edit(input_line);
		else read_line(input_line);
		next=input_line;
	}
}
