|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1982, 1986 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: * ! 6: * @(#)prf.c 7.1 (Berkeley) 6/5/86 ! 7: */ ! 8: ! 9: #include "../h/param.h" ! 10: ! 11: #include "../vax/mtpr.h" ! 12: #include "../vax/cons.h" ! 13: ! 14: /* ! 15: * Scaled down version of C Library printf. ! 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> ! 31: */ ! 32: /*VARARGS1*/ ! 33: printf(fmt, x1) ! 34: char *fmt; ! 35: unsigned x1; ! 36: { ! 37: ! 38: prf(fmt, &x1); ! 39: } ! 40: ! 41: prf(fmt, adx) ! 42: register char *fmt; ! 43: register u_int *adx; ! 44: { ! 45: register int b, c, i; ! 46: char *s; ! 47: int any; ! 48: ! 49: loop: ! 50: while ((c = *fmt++) != '%') { ! 51: if(c == '\0') ! 52: return; ! 53: putchar(c); ! 54: } ! 55: again: ! 56: c = *fmt++; ! 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; ! 71: number: ! 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++; ! 82: s = (char *)*adx; ! 83: printn((u_long)b, *s++); ! 84: any = 0; ! 85: if (b) { ! 86: while (i = *s++) { ! 87: if (b & (1 << (i-1))) { ! 88: putchar(any? ',' : '<'); ! 89: any = 1; ! 90: for (; (c = *s) > 32; s++) ! 91: putchar(c); ! 92: } else ! 93: for (; *s > 32; s++) ! 94: ; ! 95: } ! 96: if (any) ! 97: putchar('>'); ! 98: } ! 99: break; ! 100: ! 101: case 's': ! 102: s = (char *)*adx; ! 103: while (c = *s++) ! 104: putchar(c); ! 105: break; ! 106: } ! 107: adx++; ! 108: goto loop; ! 109: } ! 110: ! 111: /* ! 112: * Printn prints a number n in base b. ! 113: * We don't use recursion to avoid deep kernel stacks. ! 114: */ ! 115: printn(n, b) ! 116: u_long n; ! 117: { ! 118: char prbuf[11]; ! 119: register char *cp; ! 120: ! 121: if (b == 10 && (int)n < 0) { ! 122: putchar('-'); ! 123: n = (unsigned)(-(int)n); ! 124: } ! 125: cp = prbuf; ! 126: do { ! 127: *cp++ = "0123456789abcdef"[n%b]; ! 128: n /= b; ! 129: } while (n); ! 130: do ! 131: putchar(*--cp); ! 132: while (cp > prbuf); ! 133: } ! 134: ! 135: /* ! 136: * Print a character on console. ! 137: */ ! 138: putchar(c) ! 139: register c; ! 140: { ! 141: register s, timo; ! 142: ! 143: timo = 30000; ! 144: /* ! 145: * Try waiting for the console tty to come ready, ! 146: * otherwise give up after a reasonable time. ! 147: */ ! 148: while((mfpr(TXCS)&TXCS_RDY) == 0) ! 149: if(--timo == 0) ! 150: break; ! 151: if(c == 0) ! 152: return; ! 153: s = mfpr(TXCS); ! 154: mtpr(TXCS,0); ! 155: mtpr(TXDB, c&0xff); ! 156: if(c == '\n') ! 157: putchar('\r'); ! 158: putchar(0); ! 159: mtpr(TXCS, s); ! 160: } ! 161: ! 162: getchar() ! 163: { ! 164: register c; ! 165: ! 166: while((mfpr(RXCS)&RXCS_DONE) == 0) ! 167: ; ! 168: c = mfpr(RXDB)&0177; ! 169: if (c=='\r') ! 170: c = '\n'; ! 171: putchar(c); ! 172: return(c); ! 173: } ! 174: ! 175: gets(buf) ! 176: char *buf; ! 177: { ! 178: register char *lp; ! 179: register c; ! 180: ! 181: lp = buf; ! 182: for (;;) { ! 183: c = getchar() & 0177; ! 184: switch(c) { ! 185: case '\n': ! 186: case '\r': ! 187: c = '\n'; ! 188: *lp++ = '\0'; ! 189: return; ! 190: case '\b': ! 191: if (lp > buf) { ! 192: lp--; ! 193: putchar(' '); ! 194: putchar('\b'); ! 195: } ! 196: continue; ! 197: case '#': ! 198: case '\177': ! 199: lp--; ! 200: if (lp < buf) ! 201: lp = buf; ! 202: continue; ! 203: case '@': ! 204: case 'u'&037: ! 205: lp = buf; ! 206: putchar('\n'); ! 207: continue; ! 208: default: ! 209: *lp++ = c; ! 210: } ! 211: } ! 212: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.