BSD 4 development
[unix-history] / usr / src / sys / stand / prf.c
/* prf.c 4.1 11/9/80 */
#include "../h/cons.h"
#include "../h/mtpr.h"
/*
* Scaled down version of C Library printf.
* Only %s %u %d (==%u) %o %x %D %c 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.
*/
/*VARARGS1*/
printf(fmt, x1)
register char *fmt;
unsigned x1;
{
register c;
register unsigned int *adx;
char *s;
adx = &x1;
loop:
while((c = *fmt++) != '%') {
if(c == '\0')
return;
putchar(c);
}
c = *fmt++;
if(c == 'X')
printx((long)*adx);
else if(c == 'd' || c == 'u' || c == 'o' || c == 'x')
printn((long)*adx, c=='o'? 8: (c=='x'? 16:10));
else if(c == 'c')
putchar(*adx);
else if(c == 's') {
s = (char *)*adx;
while(c = *s++)
putchar(c);
} else if (c == 'D') {
printn(*(long *)adx, 10);
adx += (sizeof(long) / sizeof(int)) - 1;
}
adx++;
goto loop;
}
printx(x)
long x;
{
int i;
for (i = 0; i < 8; i++)
putchar("0123456789ABCDEF"[(x>>((7-i)*4))&0xf]);
}
/*
* Print an unsigned integer in base b.
*/
printn(n, b)
long n;
{
register long a;
if (n<0) { /* shouldn't happen */
putchar('-');
n = -n;
}
if(a = n/b)
printn(a, b);
putchar("0123456789ABCDEF"[(int)(n%b)]);
}
/*
* Print a character on console.
* Attempts to save and restore device
* status.
* If the switches are 0, all
* printing is inhibited.
*
* Whether or not printing is inhibited,
* the last MSGBUFS characters
* are saved in msgbuf for inspection later.
*/
putchar(c)
register c;
{
register s, timo;
timo = 30000;
/*
* Try waiting for the console tty to come ready,
* otherwise give up after a reasonable time.
*/
while((mfpr(TXCS)&TXCS_RDY) == 0)
if(--timo == 0)
break;
if(c == 0)
return;
s = mfpr(TXCS);
mtpr(TXCS,0);
mtpr(TXDB, c&0xff);
if(c == '\n')
putchar('\r');
putchar(0);
mtpr(TXCS, s);
}
getchar()
{
register c;
while((mfpr(RXCS)&RXCS_DONE) == 0)
;
c = mfpr(RXDB)&0177;
if (c=='\r')
c = '\n';
putchar(c);
return(c);
}
gets(buf)
char *buf;
{
register char *lp;
register c;
lp = buf;
for (;;) {
c = getchar() & 0177;
if (c>='A' && c<='Z')
c -= 'A' - 'a';
if (lp != buf && *(lp-1) == '\\') {
lp--;
if (c>='a' && c<='z') {
c += 'A' - 'a';
goto store;
}
switch ( c) {
case '(':
c = '{';
break;
case ')':
c = '}';
break;
case '!':
c = '|';
break;
case '^':
c = '~';
break;
case '\'':
c = '`';
break;
}
}
store:
switch(c) {
case '\n':
case '\r':
c = '\n';
*lp++ = '\0';
return;
case '\b':
case '#':
lp--;
if (lp < buf)
lp = buf;
continue;
case '@':
case 'u'&037:
lp = buf;
putchar('\n');
continue;
default:
*lp++ = c;
}
}
}