|
|
1.1 ! root 1: /* prf.c 4.1 11/9/80 */ ! 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 '@': ! 174: case 'u'&037: ! 175: lp = buf; ! 176: putchar('\n'); ! 177: continue; ! 178: default: ! 179: *lp++ = c; ! 180: } ! 181: } ! 182: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.