+
+#ifdef TRACE
+dumptrc()
+{
+ register char *cp;
+ register int pos, nch;
+
+ nch = trcprt;
+ if (nch < 0 || nch > TRCBUFS)
+ nch = TRCBUFS;
+ pos = (trcbufp - trcbuf) - nch;
+ if (pos < 0)
+ if (trcwrap)
+ pos += TRCBUFS;
+ else {
+ nch += pos;
+ pos = 0;
+ }
+ for (cp = &trcbuf[pos]; nch > 0; nch--) {
+ putchar(*cp++, 0);
+ if (cp >= &trcbuf[TRCBUFS])
+ cp = trcbuf;
+ }
+}
+#else
+/*ARGSUSED*/
+dumptrc(nch)
+ int nch;
+{
+
+}
+#endif
+
+char *msgbufp = msgbuf; /* Next saved printf character */
+/*
+ * Print a character on console or in internal trace buffer.
+ * If destination is console then the last MSGBUFS characters
+ * are saved in msgbuf for inspection later.
+ */
+/*ARGSUSED*/
+putchar(c, trace)
+register c;
+{
+
+#ifdef TRACE
+ if (trace) {
+ *trcbufp++ = c;
+ if (trcbufp >= &trcbuf[TRCBUFS]) {
+ trcbufp = trcbuf;
+ trcwrap = 1;
+ }
+ return;
+ }
+#endif
+ if (c != '\0' && c != '\r' && c != 0177) {
+ *msgbufp++ = c;
+ if (msgbufp >= &msgbuf[MSGBUFS])
+ msgbufp = msgbuf;
+ }
+ if (c == 0)
+ return;
+ cnputc(c);
+}