Annotation of researchv10no/sys/os/prf.c, revision 1.1.1.1

1.1       root        1: #include "sys/param.h"
                      2: #include "sys/buf.h"
                      3: #include "sys/mtpr.h"
                      4: #include "sys/msgbuf.h"
                      5: #include "sys/user.h"
                      6: #include "sys/pte.h"
                      7: 
                      8: /*
                      9:  * In case console is off,
                     10:  * panicstr contains argument to last
                     11:  * call to panic.
                     12:  */
                     13: char   *panicstr;
                     14: 
                     15: /*
                     16:  * Scaled down version of C Library printf.
                     17:  * Used to print diagnostic information directly on console tty.
                     18:  * Since it is not interrupt driven, all system activities are
                     19:  * suspended.  Printf should not be used for chit-chat.
                     20:  */
                     21: /*VARARGS1*/
                     22: printf(fmt, x1)
                     23:        char *fmt;
                     24:        unsigned x1;
                     25: {
                     26: 
                     27:        prf(fmt, &x1, 0);
                     28: }
                     29: 
                     30: prf(fmt, adx, touser)
                     31:        register char *fmt;
                     32:        register u_int *adx;
                     33: {
                     34:        register int b, c, i;
                     35:        char *s;
                     36:        int any;
                     37: 
                     38: loop:
                     39:        while ((c = *fmt++) != '%') {
                     40:                if(c == '\0')
                     41:                        return;
                     42:                putchar(c, touser);
                     43:        }
                     44: again:
                     45:        c = *fmt++;
                     46:        /* THIS CODE IS VAX DEPENDENT IN HANDLING %l? AND %c */
                     47:        switch (c) {
                     48: 
                     49:        case 'l':
                     50:                goto again;
                     51:        case 'x': case 'X':
                     52:                b = 16;
                     53:                goto number;
                     54:        case 'd': case 'D':
                     55:        case 'u':               /* what a joke */
                     56:                b = 10;
                     57:                goto number;
                     58:        case 'o': case 'O':
                     59:                b = 8;
                     60: number:
                     61:                printn((u_long)*adx, b, touser);
                     62:                break;
                     63:        case 'c':
                     64:                b = *adx;
                     65:                for (i = 24; i >= 0; i -= 8)
                     66:                        if (c = (b >> i) & 0x7f)
                     67:                                putchar(c, touser);
                     68:                break;
                     69:        case 'b':
                     70:                b = *adx++;
                     71:                s = (char *)*adx;
                     72:                printn((u_long)b, *s++, touser);
                     73:                any = 0;
                     74:                if (b) {
                     75:                        putchar('<', touser);
                     76:                        while (i = *s++) {
                     77:                                if (b & (1 << (i-1))) {
                     78:                                        if (any)
                     79:                                                putchar(',', touser);
                     80:                                        any = 1;
                     81:                                        for (; (c = *s) > 32; s++)
                     82:                                                putchar(c, touser);
                     83:                                } else
                     84:                                        for (; *s > 32; s++)
                     85:                                                ;
                     86:                        }
                     87:                        if (any)
                     88:                                putchar('>', touser);
                     89:                }
                     90:                break;
                     91: 
                     92:        case 's':
                     93:                s = (char *)*adx;
                     94:                while (c = *s++)
                     95:                        putchar(c, touser);
                     96:                break;
                     97: 
                     98:        case '%':
                     99:                putchar('%', touser);
                    100:                break;
                    101:        }
                    102:        adx++;
                    103:        goto loop;
                    104: }
                    105: 
                    106: /*
                    107:  * Printn prints a number n in base b.
                    108:  * We don't use recursion to avoid deep kernel stacks.
                    109:  */
                    110: printn(n, b, touser)
                    111:        u_long n;
                    112: {
                    113:        char prbuf[11];
                    114:        register char *cp;
                    115: 
                    116:        if (b == 10 && (int)n < 0) {
                    117:                putchar('-', touser);
                    118:                n = (unsigned)(-(int)n);
                    119:        }
                    120:        cp = prbuf;
                    121:        do {
                    122:                *cp++ = "0123456789abcdef"[n%b];
                    123:                n /= b;
                    124:        } while (n);
                    125:        do
                    126:                putchar(*--cp, touser);
                    127:        while (cp > prbuf);
                    128: }
                    129: 
                    130: /*
                    131:  * Panic is called on unresolvable fatal errors.
                    132:  * print `panic: mesg' and boot
                    133:  * reboot may call update if it seems safe
                    134:  */
                    135: panic(s)
                    136:        char *s;
                    137: {
                    138:        static int panicked = 0;
                    139: 
                    140:        panicstr = s;
                    141:        if (panicked++) {
                    142:                printf("panic again: %s\n", s);
                    143:                reboot(0);      /* no sync, so probably won't reenter again */
                    144:        }
                    145:        printf("panic: %s\n", s);
                    146:        reboot(1);
                    147: }
                    148: 
                    149: /*
                    150:  * Warn that a system table is full.
                    151:  */
                    152: tablefull(tab)
                    153:        char *tab;
                    154: {
                    155: 
                    156:        printf("%s: table is full\n", tab);
                    157: }
                    158: 
                    159: /*
                    160:  * Hard error is the preface to plaintive error messages
                    161:  * about failing disk transfers.
                    162:  * this is hopeless; the driver should do it.
                    163:  * the magic constant 07 shows why.
                    164:  */
                    165: harderr(bp, cp)
                    166:        struct buf *bp;
                    167:        char *cp;
                    168: {
                    169: 
                    170:        printf("%s%d%o: hard error sn%d ", cp,
                    171:            dkunit(bp), minor(bp->b_dev)&07, bp->b_blkno);
                    172: }
                    173: 
                    174: struct pte *msgbufmap;
                    175: struct msgbuf *msgbuf;
                    176: 
                    177: /*
                    178:  * Print a character on console or users terminal.
                    179:  * If destination is console then the last MSGBUFS characters
                    180:  * are saved in msgbuf for inspection later.
                    181:  */
                    182: /*ARGSUSED*/
                    183: putchar(c, touser)
                    184:        register int c;
                    185: {
                    186: 
                    187:        if (touser) {
                    188:                /* put them on user's stdout instead */
                    189:                return;
                    190:        }
                    191:        if (c != '\0' && c != '\r' && c != 0177 && mfpr(MAPEN)) {
                    192:                if (msgbuf->msg_magic != MSG_MAGIC) {
                    193:                        msgbuf->msg_bufx = 0;
                    194:                        msgbuf->msg_magic = MSG_MAGIC;
                    195:                }
                    196:                if (msgbuf->msg_bufx < 0 || msgbuf->msg_bufx >= MSG_BSIZE)
                    197:                        msgbuf->msg_bufx = 0;
                    198:                msgbuf->msg_bufc[msgbuf->msg_bufx++] = c;
                    199:        }
                    200:        if (c == 0)
                    201:                return;
                    202:        cnputc(c);
                    203: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.