|
|
1.1 ! root 1: #include "../h/cons.h" ! 2: #include "../h/mtpr.h" ! 3: ! 4: /* ! 5: * Scaled down version of C Library printf. ! 6: * Only %s %u %d (==%u) %o %x %D %c are recognized. ! 7: * Used to print diagnostic information ! 8: * directly on console tty. ! 9: * Since it is not interrupt driven, ! 10: * all system activities are pretty much ! 11: * suspended. ! 12: * Printf should not be used for chit-chat. ! 13: */ ! 14: /*VARARGS1*/ ! 15: printf(fmt, x1) ! 16: register char *fmt; ! 17: unsigned x1; ! 18: { ! 19: register c; ! 20: register unsigned int *adx; ! 21: char *s; ! 22: ! 23: adx = &x1; ! 24: loop: ! 25: while((c = *fmt++) != '%') { ! 26: if(c == '\0') ! 27: return; ! 28: putchar(c); ! 29: } ! 30: c = *fmt++; ! 31: if(c == 'X') ! 32: printx((long)*adx); ! 33: else if(c == 'd' || c == 'u' || c == 'o' || c == 'x') ! 34: printn((long)*adx, c=='o'? 8: (c=='x'? 16:10)); ! 35: else if(c == 'c') ! 36: putchar(*adx); ! 37: else if(c == 's') { ! 38: s = (char *)*adx; ! 39: while(c = *s++) ! 40: putchar(c); ! 41: } else if (c == 'D') { ! 42: printn(*(long *)adx, 10); ! 43: adx += (sizeof(long) / sizeof(int)) - 1; ! 44: } ! 45: adx++; ! 46: goto loop; ! 47: } ! 48: ! 49: printx(x) ! 50: long x; ! 51: { ! 52: int i; ! 53: ! 54: for (i = 0; i < 8; i++) ! 55: putchar("0123456789ABCDEF"[(x>>((7-i)*4))&0xf]); ! 56: } ! 57: ! 58: /* ! 59: * Print an unsigned integer in base b. ! 60: */ ! 61: printn(n, b) ! 62: long n; ! 63: { ! 64: register long a; ! 65: ! 66: if (n<0) { /* shouldn't happen */ ! 67: putchar('-'); ! 68: n = -n; ! 69: } ! 70: if(a = n/b) ! 71: printn(a, b); ! 72: putchar("0123456789ABCDEF"[(int)(n%b)]); ! 73: } ! 74: ! 75: /* ! 76: * Print a character on console. ! 77: * Attempts to save and restore device ! 78: * status. ! 79: * If the switches are 0, all ! 80: * printing is inhibited. ! 81: * ! 82: * Whether or not printing is inhibited, ! 83: * the last MSGBUFS characters ! 84: * are saved in msgbuf for inspection later. ! 85: */ ! 86: putchar(c) ! 87: register c; ! 88: { ! 89: register s, timo; ! 90: ! 91: timo = 30000; ! 92: /* ! 93: * Try waiting for the console tty to come ready, ! 94: * otherwise give up after a reasonable time. ! 95: */ ! 96: while((mfpr(TXCS)&TXCS_RDY) == 0) ! 97: if(--timo == 0) ! 98: break; ! 99: if(c == 0) ! 100: return; ! 101: s = mfpr(TXCS); ! 102: mtpr(TXCS,0); ! 103: mtpr(TXDB, c&0xff); ! 104: if(c == '\n') ! 105: putchar('\r'); ! 106: putchar(0); ! 107: mtpr(TXCS, s); ! 108: } ! 109: ! 110: getchar() ! 111: { ! 112: register c; ! 113: ! 114: while((mfpr(RXCS)&RXCS_DONE) == 0) ! 115: ; ! 116: c = mfpr(RXDB)&0177; ! 117: if (c=='\r') ! 118: c = '\n'; ! 119: putchar(c); ! 120: return(c); ! 121: } ! 122: ! 123: gets(buf) ! 124: char *buf; ! 125: { ! 126: register char *lp; ! 127: register c; ! 128: ! 129: lp = buf; ! 130: for (;;) { ! 131: c = getchar() & 0177; ! 132: if (c>='A' && c<='Z') ! 133: c -= 'A' - 'a'; ! 134: if (lp != buf && *(lp-1) == '\\') { ! 135: lp--; ! 136: if (c>='a' && c<='z') { ! 137: c += 'A' - 'a'; ! 138: goto store; ! 139: } ! 140: switch ( c) { ! 141: case '(': ! 142: c = '{'; ! 143: break; ! 144: case ')': ! 145: c = '}'; ! 146: break; ! 147: case '!': ! 148: c = '|'; ! 149: break; ! 150: case '^': ! 151: c = '~'; ! 152: break; ! 153: case '\'': ! 154: c = '`'; ! 155: break; ! 156: } ! 157: } ! 158: store: ! 159: switch(c) { ! 160: case '\n': ! 161: case '\r': ! 162: c = '\n'; ! 163: *lp++ = '\0'; ! 164: return; ! 165: case '\b': ! 166: case '#': ! 167: lp--; ! 168: if (lp < buf) ! 169: lp = buf; ! 170: continue; ! 171: case '@': ! 172: lp = buf; ! 173: putchar('\n'); ! 174: continue; ! 175: default: ! 176: *lp++ = c; ! 177: } ! 178: } ! 179: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.