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