stamp for 4bsd
[unix-history] / usr / src / sys / vax / stand / prf.c
CommitLineData
a7a8eebc 1/* prf.c 4.1 %G% */
4d05cd07
BJ
2
3#include "../h/cons.h"
4#include "../h/mtpr.h"
5
6/*
7 * Scaled down version of C Library printf.
8 * Only %s %u %d (==%u) %o %x %D %c are recognized.
9 * Used to print diagnostic information
10 * directly on console tty.
11 * Since it is not interrupt driven,
12 * all system activities are pretty much
13 * suspended.
14 * Printf should not be used for chit-chat.
15 */
16/*VARARGS1*/
17printf(fmt, x1)
18register char *fmt;
19unsigned x1;
20{
21 register c;
22 register unsigned int *adx;
23 char *s;
24
25 adx = &x1;
26loop:
27 while((c = *fmt++) != '%') {
28 if(c == '\0')
29 return;
30 putchar(c);
31 }
32 c = *fmt++;
33 if(c == 'X')
34 printx((long)*adx);
35 else if(c == 'd' || c == 'u' || c == 'o' || c == 'x')
36 printn((long)*adx, c=='o'? 8: (c=='x'? 16:10));
37 else if(c == 'c')
38 putchar(*adx);
39 else if(c == 's') {
40 s = (char *)*adx;
41 while(c = *s++)
42 putchar(c);
43 } else if (c == 'D') {
44 printn(*(long *)adx, 10);
45 adx += (sizeof(long) / sizeof(int)) - 1;
46 }
47 adx++;
48 goto loop;
49}
50
51printx(x)
52long x;
53{
54 int i;
55
56 for (i = 0; i < 8; i++)
57 putchar("0123456789ABCDEF"[(x>>((7-i)*4))&0xf]);
58}
59
60/*
61 * Print an unsigned integer in base b.
62 */
63printn(n, b)
64long n;
65{
66 register long a;
67
68 if (n<0) { /* shouldn't happen */
69 putchar('-');
70 n = -n;
71 }
72 if(a = n/b)
73 printn(a, b);
74 putchar("0123456789ABCDEF"[(int)(n%b)]);
75}
76
77/*
78 * Print a character on console.
79 * Attempts to save and restore device
80 * status.
81 * If the switches are 0, all
82 * printing is inhibited.
83 *
84 * Whether or not printing is inhibited,
85 * the last MSGBUFS characters
86 * are saved in msgbuf for inspection later.
87 */
88putchar(c)
89register c;
90{
91 register s, timo;
92
93 timo = 30000;
94 /*
95 * Try waiting for the console tty to come ready,
96 * otherwise give up after a reasonable time.
97 */
98 while((mfpr(TXCS)&TXCS_RDY) == 0)
99 if(--timo == 0)
100 break;
101 if(c == 0)
102 return;
103 s = mfpr(TXCS);
104 mtpr(TXCS,0);
105 mtpr(TXDB, c&0xff);
106 if(c == '\n')
107 putchar('\r');
108 putchar(0);
109 mtpr(TXCS, s);
110}
111
112getchar()
113{
114 register c;
115
116 while((mfpr(RXCS)&RXCS_DONE) == 0)
117 ;
118 c = mfpr(RXDB)&0177;
119 if (c=='\r')
120 c = '\n';
121 putchar(c);
122 return(c);
123}
124
125gets(buf)
126char *buf;
127{
128register char *lp;
129register c;
130
131 lp = buf;
132 for (;;) {
133 c = getchar() & 0177;
134 if (c>='A' && c<='Z')
135 c -= 'A' - 'a';
136 if (lp != buf && *(lp-1) == '\\') {
137 lp--;
138 if (c>='a' && c<='z') {
139 c += 'A' - 'a';
140 goto store;
141 }
142 switch ( c) {
143 case '(':
144 c = '{';
145 break;
146 case ')':
147 c = '}';
148 break;
149 case '!':
150 c = '|';
151 break;
152 case '^':
153 c = '~';
154 break;
155 case '\'':
156 c = '`';
157 break;
158 }
159 }
160 store:
161 switch(c) {
162 case '\n':
163 case '\r':
164 c = '\n';
165 *lp++ = '\0';
166 return;
167 case '\b':
168 case '#':
169 lp--;
170 if (lp < buf)
171 lp = buf;
172 continue;
173 case '@':
66ad0583 174 case 'u'&037:
4d05cd07
BJ
175 lp = buf;
176 putchar('\n');
177 continue;
178 default:
179 *lp++ = c;
180 }
181 }
182}