aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/db/input.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2004-04-19 19:30:50 +0000
committerrsc <devnull@localhost>2004-04-19 19:30:50 +0000
commit84114f06650ba3db950532b1d0cd1d7e18b4b6be (patch)
tree4a5aa4819d01f1798bf86c3420db542c74092a6f /src/cmd/db/input.c
parenta84cbb2a17c9d0b88c561d5b7cb50d79a19e7c46 (diff)
downloadplan9port-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.c169
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;
+}