|
|
1.1.1.2 ! root 1: /* prf.c 4.3 81/05/05 */ 1.1 root 2: 3: #include <sys/types.h> 4: #include <machine/sunromvec.h> 5: 6: /* 7: * Scaled down version of C Library printf. 8: * Used to print diagnostic information directly on console tty. 9: * Since it is not interrupt driven, all system activities are 10: * suspended. Printf should not be used for chit-chat. 11: * 12: * One additional format: %b is supported to decode error registers. 13: * Usage is: 14: * printf("reg=%b\n", regval, "<base><arg>*"); 15: * Where <base> is the output base expressed as a control character, 16: * e.g. \10 gives octal; \20 gives hex. Each arg is a sequence of 17: * characters, the first of which gives the bit number to be inspected 18: * (origin 1), and the next characters (up to a control character, i.e. 19: * a character <= 32), give the name of the register. Thus 20: * printf("reg=%b\n", 3, "\10\2BITTWO\1BITONE\n"); 21: * would produce output: 22: * reg=2<BITTWO,BITONE> 23: */ 24: /*VARARGS1*/ 25: printf(fmt, x1) 26: char *fmt; 27: unsigned x1; 28: { 29: 30: prf(fmt, &x1); 31: } 32: 33: prf(fmt, adx) 34: register char *fmt; 35: register u_int *adx; 36: { 37: register int b, c, i; 1.1.1.2 ! root 38: char *s; ! 39: int any; 1.1 root 40: 41: loop: 42: while ((c = *fmt++) != '%') { 43: if(c == '\0') 44: return; 45: putchar(c); 46: } 47: again: 48: c = *fmt++; 1.1.1.2 ! root 49: /* THIS CODE IS VAX DEPENDENT IN HANDLING %l? AND %c */ 1.1 root 50: switch (c) { 51: 52: case 'l': 53: goto again; 54: case 'x': case 'X': 55: b = 16; 56: goto number; 57: case 'd': case 'D': 58: case 'u': /* what a joke */ 59: b = 10; 60: goto number; 61: case 'o': case 'O': 62: b = 8; 63: number: 64: printn((u_long)*adx, b); 65: break; 66: case 'c': 67: b = *adx; 1.1.1.2 ! root 68: for (i = 24; i >= 0; i -= 8) ! 69: if (c = (b >> i) & 0x7f) ! 70: putchar(c); 1.1 root 71: break; 72: case 'b': 73: b = *adx++; 74: s = (char *)*adx; 75: printn((u_long)b, *s++); 76: any = 0; 77: if (b) { 78: putchar('<'); 79: while (i = *s++) { 80: if (b & (1 << (i-1))) { 81: if (any) 82: putchar(','); 83: any = 1; 84: for (; (c = *s) > 32; s++) 85: putchar(c); 86: } else 87: for (; *s > 32; s++) 88: ; 89: } 90: putchar('>'); 91: } 92: break; 93: 94: case 's': 95: s = (char *)*adx; 96: while (c = *s++) 97: putchar(c); 98: break; 99: } 100: adx++; 101: goto loop; 102: } 103: 104: /* 105: * Printn prints a number n in base b. 106: * We don't use recursion to avoid deep kernel stacks. 107: */ 108: printn(n, b) 1.1.1.2 ! root 109: u_long n; 1.1 root 110: { 111: char prbuf[11]; 112: register char *cp; 113: 114: if (b == 10 && (int)n < 0) { 115: putchar('-'); 116: n = (unsigned)(-(int)n); 117: } 118: cp = prbuf; 119: do { 120: *cp++ = "0123456789abcdef"[n%b]; 121: n /= b; 122: } while (n); 123: do 124: putchar(*--cp); 125: while (cp > prbuf); 126: } 127: 128: /* 129: * Print a character on console. 130: */ 131: putchar(c) 132: int c; 133: { 134: 135: (*romp->v_putchar)(c); 136: } 1.1.1.2 ! root 137: ! 138: getchar() ! 139: { ! 140: register c; ! 141: ! 142: while ((c = (*romp->v_mayget)()) == -1) ! 143: ; ! 144: if (c == '\r') ! 145: c = '\n'; ! 146: if (c == 0177 || c == '\b') { ! 147: putchar('\b'); ! 148: putchar(' '); ! 149: c = '\b'; ! 150: } ! 151: putchar(c); ! 152: return (c); ! 153: } ! 154: ! 155: gets(buf) ! 156: char *buf; ! 157: { ! 158: register char *lp; ! 159: register c; ! 160: ! 161: lp = buf; ! 162: for (;;) { ! 163: c = getchar() & 0177; ! 164: store: ! 165: switch(c) { ! 166: case '\n': ! 167: case '\r': ! 168: c = '\n'; ! 169: *lp++ = '\0'; ! 170: return; ! 171: case '\b': ! 172: case '#': ! 173: lp--; ! 174: if (lp < buf) ! 175: lp = buf; ! 176: continue; ! 177: case '@': ! 178: case 'u'&037: ! 179: lp = buf; ! 180: putchar('\n'); ! 181: continue; ! 182: default: ! 183: *lp++ = c; ! 184: } ! 185: } ! 186: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.