add Berkeley specific header; not rc.local, netstart now; minor cleanup
[unix-history] / usr / src / sys / vax / stand / prf.c
CommitLineData
55b4dbd0 1/*
0880b18e 2 * Copyright (c) 1982, 1986 Regents of the University of California.
55b4dbd0
KM
3 * All rights reserved. The Berkeley software License Agreement
4 * specifies the terms and conditions for redistribution.
5 *
37dc7db2 6 * @(#)prf.c 7.4 (Berkeley) %G%
55b4dbd0 7 */
4d05cd07 8
39c71180 9#include "param.h"
a031a31b
SL
10
11#include "../vax/mtpr.h"
12#include "../vax/cons.h"
4d05cd07
BJ
13
14/*
15 * Scaled down version of C Library printf.
99fe9747
BJ
16 * Used to print diagnostic information directly on console tty.
17 * Since it is not interrupt driven, all system activities are
18 * suspended. Printf should not be used for chit-chat.
19 *
20 * One additional format: %b is supported to decode error registers.
21 * Usage is:
22 * printf("reg=%b\n", regval, "<base><arg>*");
23 * Where <base> is the output base expressed as a control character,
24 * e.g. \10 gives octal; \20 gives hex. Each arg is a sequence of
25 * characters, the first of which gives the bit number to be inspected
26 * (origin 1), and the next characters (up to a control character, i.e.
27 * a character <= 32), give the name of the register. Thus
28 * printf("reg=%b\n", 3, "\10\2BITTWO\1BITONE\n");
29 * would produce output:
30 * reg=2<BITTWO,BITONE>
4d05cd07
BJ
31 */
32/*VARARGS1*/
33printf(fmt, x1)
99fe9747
BJ
34 char *fmt;
35 unsigned x1;
4d05cd07 36{
99fe9747
BJ
37
38 prf(fmt, &x1);
39}
40
41prf(fmt, adx)
42 register char *fmt;
43 register u_int *adx;
44{
45 register int b, c, i;
4d05cd07 46 char *s;
99fe9747 47 int any;
4d05cd07 48
4d05cd07 49loop:
99fe9747 50 while ((c = *fmt++) != '%') {
4d05cd07
BJ
51 if(c == '\0')
52 return;
53 putchar(c);
54 }
99fe9747 55again:
4d05cd07 56 c = *fmt++;
99fe9747
BJ
57 /* THIS CODE IS VAX DEPENDENT IN HANDLING %l? AND %c */
58 switch (c) {
59
60 case 'l':
61 goto again;
62 case 'x': case 'X':
63 b = 16;
64 goto number;
65 case 'd': case 'D':
66 case 'u': /* what a joke */
67 b = 10;
68 goto number;
69 case 'o': case 'O':
70 b = 8;
71number:
72 printn((u_long)*adx, b);
73 break;
74 case 'c':
75 b = *adx;
76 for (i = 24; i >= 0; i -= 8)
77 if (c = (b >> i) & 0x7f)
78 putchar(c);
79 break;
80 case 'b':
81 b = *adx++;
4d05cd07 82 s = (char *)*adx;
99fe9747
BJ
83 printn((u_long)b, *s++);
84 any = 0;
85 if (b) {
99fe9747
BJ
86 while (i = *s++) {
87 if (b & (1 << (i-1))) {
d3553ea4 88 putchar(any? ',' : '<');
99fe9747
BJ
89 any = 1;
90 for (; (c = *s) > 32; s++)
91 putchar(c);
92 } else
93 for (; *s > 32; s++)
94 ;
95 }
d3553ea4
MK
96 if (any)
97 putchar('>');
99fe9747
BJ
98 }
99 break;
100
101 case 's':
102 s = (char *)*adx;
103 while (c = *s++)
4d05cd07 104 putchar(c);
99fe9747 105 break;
4d05cd07
BJ
106 }
107 adx++;
108 goto loop;
109}
110
4d05cd07
BJ
111/*
112 * Print a character on console.
4d05cd07
BJ
113 */
114putchar(c)
99fe9747 115 register c;
4d05cd07
BJ
116{
117 register s, timo;
118
119 timo = 30000;
120 /*
121 * Try waiting for the console tty to come ready,
122 * otherwise give up after a reasonable time.
123 */
124 while((mfpr(TXCS)&TXCS_RDY) == 0)
125 if(--timo == 0)
126 break;
127 if(c == 0)
128 return;
129 s = mfpr(TXCS);
130 mtpr(TXCS,0);
131 mtpr(TXDB, c&0xff);
132 if(c == '\n')
133 putchar('\r');
134 putchar(0);
135 mtpr(TXCS, s);
136}
137
138getchar()
139{
140 register c;
141
142 while((mfpr(RXCS)&RXCS_DONE) == 0)
143 ;
144 c = mfpr(RXDB)&0177;
145 if (c=='\r')
146 c = '\n';
a14fe297
MK
147 if (c != '\b' && c != '\177')
148 putchar(c);
4d05cd07
BJ
149 return(c);
150}