Commit | Line | Data |
---|---|---|
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*/ | |
17 | printf(fmt, x1) | |
18 | register char *fmt; | |
19 | unsigned x1; | |
20 | { | |
21 | register c; | |
22 | register unsigned int *adx; | |
23 | char *s; | |
24 | ||
25 | adx = &x1; | |
26 | loop: | |
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 | ||
51 | printx(x) | |
52 | long 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 | */ | |
63 | printn(n, b) | |
64 | long 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 | */ | |
88 | putchar(c) | |
89 | register 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 | ||
112 | getchar() | |
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 | ||
125 | gets(buf) | |
126 | char *buf; | |
127 | { | |
128 | register char *lp; | |
129 | register 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 | } |