/* | |
* | |
* 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; | |
} |