diff options
Diffstat (limited to 'src/cmd/db/input.c')
| -rw-r--r-- | src/cmd/db/input.c | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/src/cmd/db/input.c b/src/cmd/db/input.c new file mode 100644 index 00000000..8cd091b0 --- /dev/null +++ b/src/cmd/db/input.c @@ -0,0 +1,169 @@ +/* + * + * 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; +} |
