/*
 *
 *	debugger
 *
 */

#include "defs.h"
#include "fns.h"

Rune	line[LINSIZ];
extern	int	infile;
Rune	*lp;
int	peekc,lastc = EOR;
int	eof;

/* input routines */

int
eol(int c)
{
	return(c==EOR || c==';');
}

int
rdc(void)
{
	do {
		readchar();
	} while (lastc==SPC || lastc==TB);
	return(lastc);
}

void
reread(void)
{
	peekc = lastc;
}

void
clrinp(void)
{
	flush();
	lp = 0;
	peekc = 0;
}

int
readrune(int fd, Rune *r)
{
	char buf[UTFmax];
	int i;

	for(i=0; i<UTFmax && !fullrune(buf, i); i++)
		if(read(fd, buf+i, 1) <= 0)
			return -1;
	chartorune(r, buf);
	return 1;
}

int
readchar(void)
{
	Rune *p;

	if (eof)
		lastc=0;
	else if (peekc) {
		lastc = peekc;
		peekc = 0;
	}
	else {
		if (lp==0) {
			for (p = line; p < &line[LINSIZ-1]; p++) {
				eof = readrune(infile, p) <= 0;
				if (mkfault) {
					eof = 0;
					error(0);
				}
				if (eof) {
					p--;
					break;
				}
				if (*p == EOR) {
					if (p <= line)
						break;
					if (p[-1] != '\\')
						break;
					p -= 2;
				}
			}
			p[1] = 0;
			lp = line;
		}
		if ((lastc = *lp) != 0)
			lp++;
	}
	return(lastc);
}

int
nextchar(void)
{
	if (eol(rdc())) {
		reread();
		return(0);
	}
	return(lastc);
}

int
quotchar(void)
{
	if (readchar()=='\\')
		return(readchar());
	else if (lastc=='\'')
		return(0);
	else
		return(lastc);
}

void
getformat(char *deformat)
{
	char *fptr;
	BOOL	quote;
	Rune r;

	fptr=deformat;
	quote=FALSE;
	while ((quote ? readchar()!=EOR : !eol(readchar()))){
		r = lastc;
		fptr += runetochar(fptr, &r);
		if (lastc == '"')
			quote = ~quote;
	}
	lp--;
	if (fptr!=deformat)
		*fptr = '\0';
}

/*
 *	check if the input line if of the form:
 *		<filename>:<digits><verb> ...
 *
 *	we handle this case specially because we have to look ahead
 *	at the token after the colon to decide if it is a file reference
 *	or a colon-command with a symbol name prefix. 
 */

int
isfileref(void)
{
	Rune *cp;

	for (cp = lp-1; *cp && !strchr(CMD_VERBS, *cp); cp++)
		if (*cp == '\\' && cp[1])	/* escape next char */
			cp++;
	if (*cp && cp > lp-1) {
		while (*cp == ' ' || *cp == '\t')
			cp++;
		if (*cp++ == ':') {
			while (*cp == ' ' || *cp == '\t')
				cp++;
			if (isdigit(*cp))
				return 1;
		}
	}
	return 0;
}
