xref: /plan9/sys/src/cmd/db/input.c (revision 094743981686051321c10cc7fb9d9f942f360f45)
13e12c5d1SDavid du Colombier /*
23e12c5d1SDavid du Colombier  *
33e12c5d1SDavid du Colombier  *	debugger
43e12c5d1SDavid du Colombier  *
53e12c5d1SDavid du Colombier  */
63e12c5d1SDavid du Colombier 
73e12c5d1SDavid du Colombier #include "defs.h"
83e12c5d1SDavid du Colombier #include "fns.h"
93e12c5d1SDavid du Colombier 
109a747e4fSDavid du Colombier Rune	line[LINSIZ];
113e12c5d1SDavid du Colombier extern	int	infile;
129a747e4fSDavid du Colombier Rune	*lp;
139a747e4fSDavid du Colombier int	peekc,lastc = EOR;
143e12c5d1SDavid du Colombier int	eof;
153e12c5d1SDavid du Colombier 
163e12c5d1SDavid du Colombier /* input routines */
173e12c5d1SDavid du Colombier 
eol(int c)183e12c5d1SDavid du Colombier eol(int c)
193e12c5d1SDavid du Colombier {
203e12c5d1SDavid du Colombier 	return(c==EOR || c==';');
213e12c5d1SDavid du Colombier }
223e12c5d1SDavid du Colombier 
233e12c5d1SDavid du Colombier int
rdc(void)243e12c5d1SDavid du Colombier rdc(void)
253e12c5d1SDavid du Colombier {
263e12c5d1SDavid du Colombier 	do {
273e12c5d1SDavid du Colombier 		readchar();
283e12c5d1SDavid du Colombier 	} while (lastc==SPC || lastc==TB);
293e12c5d1SDavid du Colombier 	return(lastc);
303e12c5d1SDavid du Colombier }
313e12c5d1SDavid du Colombier 
323e12c5d1SDavid du Colombier void
reread(void)333e12c5d1SDavid du Colombier reread(void)
343e12c5d1SDavid du Colombier {
353e12c5d1SDavid du Colombier 	peekc = lastc;
363e12c5d1SDavid du Colombier }
373e12c5d1SDavid du Colombier 
383e12c5d1SDavid du Colombier void
clrinp(void)393e12c5d1SDavid du Colombier clrinp(void)
403e12c5d1SDavid du Colombier {
413e12c5d1SDavid du Colombier 	flush();
423e12c5d1SDavid du Colombier 	lp = 0;
433e12c5d1SDavid du Colombier 	peekc = 0;
443e12c5d1SDavid du Colombier }
453e12c5d1SDavid du Colombier 
463e12c5d1SDavid du Colombier int
readrune(int fd,Rune * r)479a747e4fSDavid du Colombier readrune(int fd, Rune *r)
489a747e4fSDavid du Colombier {
49*09474398SDavid du Colombier 	char buf[UTFmax+1];
509a747e4fSDavid du Colombier 	int i;
519a747e4fSDavid du Colombier 
529a747e4fSDavid du Colombier 	for(i=0; i<UTFmax && !fullrune(buf, i); i++)
539a747e4fSDavid du Colombier 		if(read(fd, buf+i, 1) <= 0)
549a747e4fSDavid du Colombier 			return -1;
55*09474398SDavid du Colombier 	buf[i] = 0;
569a747e4fSDavid du Colombier 	chartorune(r, buf);
579a747e4fSDavid du Colombier 	return 1;
589a747e4fSDavid du Colombier }
599a747e4fSDavid du Colombier 
609a747e4fSDavid du Colombier int
readchar(void)613e12c5d1SDavid du Colombier readchar(void)
623e12c5d1SDavid du Colombier {
639a747e4fSDavid du Colombier 	Rune *p;
649a747e4fSDavid du Colombier 
653e12c5d1SDavid du Colombier 	if (eof)
663e12c5d1SDavid du Colombier 		lastc=0;
673e12c5d1SDavid du Colombier 	else if (peekc) {
683e12c5d1SDavid du Colombier 		lastc = peekc;
693e12c5d1SDavid du Colombier 		peekc = 0;
703e12c5d1SDavid du Colombier 	}
713e12c5d1SDavid du Colombier 	else {
723e12c5d1SDavid du Colombier 		if (lp==0) {
733e12c5d1SDavid du Colombier 			for (p = line; p < &line[LINSIZ-1]; p++) {
749a747e4fSDavid du Colombier 				eof = readrune(infile, p) <= 0;
753e12c5d1SDavid du Colombier 				if (mkfault) {
763e12c5d1SDavid du Colombier 					eof = 0;
773e12c5d1SDavid du Colombier 					error(0);
783e12c5d1SDavid du Colombier 				}
793e12c5d1SDavid du Colombier 				if (eof) {
803e12c5d1SDavid du Colombier 					p--;
813e12c5d1SDavid du Colombier 					break;
823e12c5d1SDavid du Colombier 				}
833e12c5d1SDavid du Colombier 				if (*p == EOR) {
843e12c5d1SDavid du Colombier 					if (p <= line)
853e12c5d1SDavid du Colombier 						break;
863e12c5d1SDavid du Colombier 					if (p[-1] != '\\')
873e12c5d1SDavid du Colombier 						break;
883e12c5d1SDavid du Colombier 					p -= 2;
893e12c5d1SDavid du Colombier 				}
903e12c5d1SDavid du Colombier 			}
913e12c5d1SDavid du Colombier 			p[1] = 0;
923e12c5d1SDavid du Colombier 			lp = line;
933e12c5d1SDavid du Colombier 		}
943e12c5d1SDavid du Colombier 		if ((lastc = *lp) != 0)
953e12c5d1SDavid du Colombier 			lp++;
963e12c5d1SDavid du Colombier 	}
973e12c5d1SDavid du Colombier 	return(lastc);
983e12c5d1SDavid du Colombier }
993e12c5d1SDavid du Colombier 
nextchar(void)1003e12c5d1SDavid du Colombier nextchar(void)
1013e12c5d1SDavid du Colombier {
1023e12c5d1SDavid du Colombier 	if (eol(rdc())) {
1033e12c5d1SDavid du Colombier 		reread();
1043e12c5d1SDavid du Colombier 		return(0);
1053e12c5d1SDavid du Colombier 	}
1063e12c5d1SDavid du Colombier 	return(lastc);
1073e12c5d1SDavid du Colombier }
1083e12c5d1SDavid du Colombier 
quotchar(void)1093e12c5d1SDavid du Colombier quotchar(void)
1103e12c5d1SDavid du Colombier {
1113e12c5d1SDavid du Colombier 	if (readchar()=='\\')
1123e12c5d1SDavid du Colombier 		return(readchar());
1133e12c5d1SDavid du Colombier 	else if (lastc=='\'')
1143e12c5d1SDavid du Colombier 		return(0);
1153e12c5d1SDavid du Colombier 	else
1163e12c5d1SDavid du Colombier 		return(lastc);
1173e12c5d1SDavid du Colombier }
1183e12c5d1SDavid du Colombier 
1193e12c5d1SDavid du Colombier void
getformat(char * deformat)1203e12c5d1SDavid du Colombier getformat(char *deformat)
1213e12c5d1SDavid du Colombier {
1223e12c5d1SDavid du Colombier 	char *fptr;
1233e12c5d1SDavid du Colombier 	BOOL	quote;
1249a747e4fSDavid du Colombier 	Rune r;
1253e12c5d1SDavid du Colombier 
1263e12c5d1SDavid du Colombier 	fptr=deformat;
1273e12c5d1SDavid du Colombier 	quote=FALSE;
1289a747e4fSDavid du Colombier 	while ((quote ? readchar()!=EOR : !eol(readchar()))){
1299a747e4fSDavid du Colombier 		r = lastc;
1309a747e4fSDavid du Colombier 		fptr += runetochar(fptr, &r);
1319a747e4fSDavid du Colombier 		if (lastc == '"')
1323e12c5d1SDavid du Colombier 			quote = ~quote;
1339a747e4fSDavid du Colombier 	}
1343e12c5d1SDavid du Colombier 	lp--;
1353e12c5d1SDavid du Colombier 	if (fptr!=deformat)
1363e12c5d1SDavid du Colombier 		*fptr = '\0';
1373e12c5d1SDavid du Colombier }
1383e12c5d1SDavid du Colombier 
1393e12c5d1SDavid du Colombier /*
1403e12c5d1SDavid du Colombier  *	check if the input line if of the form:
1413e12c5d1SDavid du Colombier  *		<filename>:<digits><verb> ...
1423e12c5d1SDavid du Colombier  *
1433e12c5d1SDavid du Colombier  *	we handle this case specially because we have to look ahead
1443e12c5d1SDavid du Colombier  *	at the token after the colon to decide if it is a file reference
1453e12c5d1SDavid du Colombier  *	or a colon-command with a symbol name prefix.
1463e12c5d1SDavid du Colombier  */
1473e12c5d1SDavid du Colombier 
1483e12c5d1SDavid du Colombier int
isfileref(void)1493e12c5d1SDavid du Colombier isfileref(void)
1503e12c5d1SDavid du Colombier {
1519a747e4fSDavid du Colombier 	Rune *cp;
1523e12c5d1SDavid du Colombier 
1533e12c5d1SDavid du Colombier 	for (cp = lp-1; *cp && !strchr(CMD_VERBS, *cp); cp++)
1543e12c5d1SDavid du Colombier 		if (*cp == '\\' && cp[1])	/* escape next char */
1553e12c5d1SDavid du Colombier 			cp++;
1563e12c5d1SDavid du Colombier 	if (*cp && cp > lp-1) {
1573e12c5d1SDavid du Colombier 		while (*cp == ' ' || *cp == '\t')
1583e12c5d1SDavid du Colombier 			cp++;
1593e12c5d1SDavid du Colombier 		if (*cp++ == ':') {
1603e12c5d1SDavid du Colombier 			while (*cp == ' ' || *cp == '\t')
1613e12c5d1SDavid du Colombier 				cp++;
1623e12c5d1SDavid du Colombier 			if (isdigit(*cp))
1633e12c5d1SDavid du Colombier 				return 1;
1643e12c5d1SDavid du Colombier 		}
1653e12c5d1SDavid du Colombier 	}
1663e12c5d1SDavid du Colombier 	return 0;
1673e12c5d1SDavid du Colombier }
168