debugger
diff --git a/src/cmd/db/input.c b/src/cmd/db/input.c
new file mode 100644
index 0000000..8cd091b
--- /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;
+}