2.11BSD/sys/pdpstand/prf.c
/*
* Copyright (c) 1986 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*
* @(#)prf.c 1.4 (2.11BSD) 1996/06/04
*/
#include "../machine/cons.h"
#define KLADDR ((struct dldevice *)0177560)
#define CTRL(x) ('x' & 037)
/*
* Scaled down version of C Library printf. Only %s %u %d (==%u) %o %x %D
* are recognized. Used to print diagnostic information directly on
* console tty. Since it is not interrupt driven, all system activities
* are pretty much suspended. Printf should not be used for chit-chat.
*/
printf(fmt, x1)
register char *fmt;
unsigned x1;
{
register c;
register unsigned int *adx;
unsigned char *s;
adx = &x1;
loop:
while ((c = *fmt++) != '%') {
if (c == '\0')
return;
putchar(c);
}
c = *fmt++;
if (c == 'd' || c == 'u' || c == 'o' || c == 'x')
printn((long)*adx, c=='o'? 8: (c=='x'? 16:10));
else if (c == 's') {
s = (unsigned char *)*adx;
while (c = *s++)
putchar(c);
} else if (c == 'D' || c == 'O') {
printn(*(long *)adx, c == 'D' ? 10 : 8);
adx += (sizeof(long) / sizeof(int)) - 1;
} else if (c == 'c')
putchar((char *)*adx);
adx++;
goto loop;
}
/*
* Print an unsigned integer in base b.
*/
printn(n, b)
long n;
register int b;
{
long a;
if (n < 0) { /* shouldn't happen */
putchar('-');
n = -n;
}
if (a = n/b)
printn(a, b);
putchar("0123456789ABCDEF"[(int)(n%b)]);
}
putchar(c)
register c;
{
register s;
register unsigned timo;
#ifdef notdef
/*
* If last char was a break or null, don't print
*/
if ((KLADDR->dlrbuf & 0177) == 0)
return;
#endif
/*
* If we got a XOFF, wait for a XON
*/
if ((KLADDR->dlrcsr & DL_RDONE) != 0)
if ((KLADDR->dlrbuf & 0177) == 19)
while ((KLADDR->dlrbuf & 0177) != 17)
continue;
/*
* Try waiting for the console tty to come ready,
* otherwise give up after a reasonable time.
*/
timo=60000;
while ((KLADDR->dlxcsr & DLXCSR_TRDY) == 0)
if (--timo == 0)
break;
if (c == 0)
return(c);
s = KLADDR->dlxcsr;
KLADDR->dlxcsr = 0;
KLADDR->dlxbuf = c;
if (c == '\n') {
putchar('\r');
putchar(0177);
}
putchar(0);
KLADDR->dlxcsr = s;
return(c);
}
getchar()
{
register c;
KLADDR->dlrcsr = DL_RE;
while ((KLADDR->dlrcsr & DL_RDONE) == 0)
continue;
c = KLADDR->dlrbuf & 0177;
if (c=='\r')
c = '\n';
return(c);
}
gets(buf)
char *buf;
{
register char *lp, *cp;
register int c;
lp = buf;
for (;;) {
c = getchar() & 0177;
switch (c) {
default:
if (c < ' ' || c >= 127)
putchar(CTRL(G));
else {
*lp++ = c;
putchar(c);
}
break;
case '\n':
case '\r':
putchar('\n');
c = '\n';
*lp++ = '\0';
return;
case '\177':
case '\b':
case '#':
if (lp <= buf)
putchar(CTRL(G));
else {
lp--;
putchar('\b');
putchar(' ');
putchar('\b');
}
break;
case CTRL(U):
case '@':
while (lp > buf) {
lp--;
putchar('\b');
putchar(' ');
putchar('\b');
}
break;
case CTRL(R):
putchar('^');
putchar('R');
putchar('\n');
for (cp = buf; cp < lp; cp++)
putchar(*cp);
break;
}
}
}