167 lines
2.1 KiB
C
167 lines
2.1 KiB
C
/*
|
|
*
|
|
* debugger
|
|
*
|
|
*/
|
|
|
|
#include "defs.h"
|
|
#include "fns.h"
|
|
|
|
Rune line[LINSIZ];
|
|
extern int infile;
|
|
Rune *lp;
|
|
int peekc,lastc = EOR;
|
|
int eof;
|
|
|
|
/* input routines */
|
|
|
|
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);
|
|
}
|
|
|
|
nextchar(void)
|
|
{
|
|
if (eol(rdc())) {
|
|
reread();
|
|
return(0);
|
|
}
|
|
return(lastc);
|
|
}
|
|
|
|
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;
|
|
}
|