diff options
author | rsc <devnull@localhost> | 2004-04-19 19:30:50 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2004-04-19 19:30:50 +0000 |
commit | 84114f06650ba3db950532b1d0cd1d7e18b4b6be (patch) | |
tree | 4a5aa4819d01f1798bf86c3420db542c74092a6f /src/cmd/db/input.c | |
parent | a84cbb2a17c9d0b88c561d5b7cb50d79a19e7c46 (diff) | |
download | plan9port-84114f06650ba3db950532b1d0cd1d7e18b4b6be.tar.gz plan9port-84114f06650ba3db950532b1d0cd1d7e18b4b6be.tar.bz2 plan9port-84114f06650ba3db950532b1d0cd1d7e18b4b6be.zip |
debugger
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; +} |