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