|
|
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.6 (Berkeley) 8/27/88 ! 7: */ ! 8: ! 9: #include "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: * Print a character on console. ! 113: */ ! 114: putchar(c) ! 115: register c; ! 116: { ! 117: register s, timo; ! 118: #if VAX630 || VAX650 ! 119: extern (*v_putc)(); ! 120: ! 121: if (v_putc) { ! 122: (*v_putc)(c); ! 123: if (c == '\n') ! 124: (*v_putc)('\r'); ! 125: return; ! 126: } ! 127: #endif ! 128: timo = 30000; ! 129: /* ! 130: * Try waiting for the console tty to come ready, ! 131: * otherwise give up after a reasonable time. ! 132: */ ! 133: while((mfpr(TXCS)&TXCS_RDY) == 0) ! 134: if(--timo == 0) ! 135: break; ! 136: if(c == 0) ! 137: return; ! 138: s = mfpr(TXCS); ! 139: mtpr(TXCS,0); ! 140: mtpr(TXDB, c&0xff); ! 141: if(c == '\n') ! 142: putchar('\r'); ! 143: putchar(0); ! 144: mtpr(TXCS, s); ! 145: } ! 146: ! 147: getchar() ! 148: { ! 149: register c; ! 150: #if VAX630 || VAX650 ! 151: extern (*v_getc)(); ! 152: ! 153: if (v_getc) { ! 154: c = (*v_getc)(); ! 155: } else { ! 156: #endif ! 157: while((mfpr(RXCS)&RXCS_DONE) == 0) ! 158: ; ! 159: c = mfpr(RXDB)&0177; ! 160: #if VAX630 || VAX650 ! 161: } ! 162: #endif ! 163: if (c=='\r') ! 164: c = '\n'; ! 165: if (c != '\b' && c != '\177') ! 166: putchar(c); ! 167: return(c); ! 168: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.