Annotation of 43BSDTahoe/new/jove/fmt.c, revision 1.1.1.1

1.1       root        1: /***************************************************************************
                      2:  * This program is Copyright (C) 1986, 1987, 1988 by Jonathan Payne.  JOVE *
                      3:  * is provided to you without charge, and with no warranty.  You may give  *
                      4:  * away copies of JOVE, including sources, provided that this notice is    *
                      5:  * included in all the files.                                              *
                      6:  ***************************************************************************/
                      7: 
                      8: #include "jove.h"
                      9: #include "io.h"
                     10: #include "termcap.h"
                     11: 
                     12: #ifdef MAC
                     13: #      include  "mac.h"
                     14: #else
                     15: #      include <varargs.h>
                     16: #endif
                     17: 
                     18: #ifdef MAC
                     19: #      undef private
                     20: #      define private
                     21: #endif
                     22: 
                     23: #ifdef LINT_ARGS
                     24: private void
                     25:        doformat(File *, char *, ...),
                     26:        outld(long, int),
                     27:        pad(int, int),
                     28:        PPchar(int, char *),
                     29:        putld(long, int),
                     30:        puts(char *);
                     31: #else
                     32: private void
                     33:        doformat(),
                     34:        outld(),
                     35:        pad(),
                     36:        PPchar(),
                     37:        putld(),
                     38:        puts();
                     39: #endif /* LINT_ARGS */
                     40: 
                     41: #ifdef MAC
                     42: #      undef private
                     43: #      define private static
                     44: #endif
                     45: 
                     46: 
                     47: char   mesgbuf[MESG_SIZE];
                     48: 
                     49: /* VARARGS2 */
                     50: 
                     51: void
                     52: format(buf, len, fmt, ap)
                     53: char   *buf,
                     54:        *fmt;
                     55: va_list        ap;
                     56: {
                     57:        File    strbuf,
                     58:                *sp = &strbuf;
                     59: 
                     60:        sp->f_ptr = sp->f_base = buf;
                     61:        sp->f_fd = -1;          /* Not legit for files */
                     62:        sp->f_cnt = len;
                     63:        sp->f_flags = F_STRING;
                     64:        sp->f_bufsize = len;
                     65: 
                     66:        doformat(sp, fmt, ap);
                     67:        putc('\0', sp);
                     68: }
                     69: 
                     70: #ifdef IBMPC
                     71: int    specialmap = 0,
                     72:        specialkey = 0;
                     73: 
                     74: #define Empty ""
                     75: 
                     76: char *altseq[133] = {
                     77: Empty, Empty, Empty, "Ctrl-@", Empty, Empty, Empty, Empty,
                     78: Empty, Empty, Empty, Empty, Empty, Empty, Empty, "Left", 
                     79: "Alt-Q", "Alt-W", "Alt-E", "Alt-R", "Alt-T", "Alt-Y", "Alt-U", "Alt-I",
                     80: "Alt-O", "Alt-P", Empty, Empty, Empty, Empty, "Alt-A", "Alt-S",
                     81: "Alt-D", "Alt-F", "Alt-G", "Alt-H", "Alt-J", "Alt-K", "Alt-L", Empty,
                     82: Empty, Empty, Empty, Empty, "Alt-Z", "Alt-X", "Alt-C", "Alt-V",
                     83: "Alt-B", "Alt-N", "Alt-M", Empty, Empty, Empty, Empty, Empty,
                     84: Empty, Empty, Empty, "F1", "F2", "F3", "F4", "F5", 
                     85: "F6", "F7", "F8", "F9", "F10", Empty, Empty, "Home",
                     86: "Up", "PageUp", Empty, "Left", Empty, "Right", Empty, "End",
                     87: "Down", "PageDown", "Ins", "Del", "Shift F1", "Shift F2", "Shift F3", "Shift F4", 
                     88: "Shift F5", "Shift F6", "Shift F7", "Shift F8", "Shift F9", "Shift F10", "Ctrl F1", "Ctrl F2",
                     89: "Ctrl F3", "Ctrl F4", "Ctrl F5", "Ctrl F6", "Ctrl F7", "Ctrl F8", "Ctrl F9", "Ctrl F10", 
                     90: "Alt F1", "Alt F2", "Alt F3", "Alt F4", "Alt F5", "Alt F6", "Alt F7", "Alt F8",
                     91: "Alt F9", "Alt F10", "Ctrl PrtSc", "Ctrl Left", "Ctrl Right", "Ctrl End", "Ctrl PageDown", "Ctrl Home",
                     92: "Alt 1", "Alt 2", "Alt 3", "Alt 4", "Alt 5", "Alt 6", "Alt 7", "Alt 8",
                     93: "Alt 9", "Alt 0", "Alt Minus", "Alt Equals", "Ctrl PageUp" 
                     94: };
                     95: #endif
                     96: 
                     97: 
                     98: private void
                     99: PPchar(c, str)
                    100: int    c;
                    101: char   *str;
                    102: {
                    103:        char    *cp = str;
                    104: 
                    105: #ifdef IBMPC
                    106:        if (specialmap || specialkey) {
                    107:                if (c < 0 || c > 132)
                    108:                        c = 0;
                    109:                strcpy(cp, altseq[c]);
                    110:        } else
                    111: #endif 
                    112:        if (c == '\033')
                    113:                strcpy(cp, "ESC");
                    114: #ifdef IBMPC                           /* this character is invisible */
                    115:        else if (c == '\377') {
                    116:                        *cp = 0;
                    117:        }
                    118: #endif /* IBMPC */
                    119:        else if (c < ' ')
                    120:                sprintf(cp, "C-%c", c + '@');
                    121:        else if (c == '\177')
                    122:                strcpy(cp, "^?");
                    123:        else
                    124:                sprintf(cp, "%c", c);
                    125: }
                    126: 
                    127: private struct fmt_state {
                    128:        int     precision,
                    129:                width,
                    130:                leftadj;
                    131:        char    padc;
                    132:        File    *iop;
                    133: } current_fmt;
                    134: 
                    135: private void
                    136: putld(d, base)
                    137: long   d;
                    138: {
                    139:        int     length = 1;
                    140:        long    tmpd = d;
                    141: 
                    142:        if (current_fmt.width == 0 && current_fmt.precision) {
                    143:                current_fmt.width = current_fmt.precision;
                    144:                current_fmt.padc = '0';
                    145:        }
                    146:        while (tmpd = (tmpd / base))
                    147:                length += 1;
                    148:        if (d < 0)
                    149:                length += 1;
                    150:        if (!current_fmt.leftadj)
                    151:                pad(current_fmt.padc, current_fmt.width - length);
                    152:        if (d < 0) {
                    153:                putc('-', current_fmt.iop);
                    154:                d = -d;
                    155:        }
                    156:        outld(d, base);
                    157:        if (current_fmt.leftadj)
                    158:                pad(current_fmt.padc, current_fmt.width - length);
                    159: }
                    160: 
                    161: private void
                    162: outld(d, base)
                    163: long   d;
                    164: {
                    165:        register long   n;
                    166:        static char     chars[] = {'0', '1', '2', '3', '4', '5', '6',
                    167:                                    '7', '8', '9', 'a', 'b', 'c', 'd',
                    168:                                    'e', 'f'};
                    169: 
                    170:        if (n = (d / base))
                    171:                outld(n, base);
                    172:        putc((int) (chars[(int) (d % base)]), current_fmt.iop);
                    173: }
                    174: 
                    175: private void
                    176: puts(str)
                    177: char   *str;
                    178: {
                    179:        int     length;
                    180:        register char   *cp;
                    181: 
                    182:        if (str == 0)
                    183: #if pyr
                    184:                str = "";
                    185: #else
                    186:                str = "(null)";
                    187: #endif
                    188:        length = strlen(str);
                    189:        if (current_fmt.precision == 0 || length < current_fmt.precision)
                    190:                current_fmt.precision = length;
                    191:        else
                    192:                length = current_fmt.precision;
                    193:        cp = str;
                    194:        if (!current_fmt.leftadj)
                    195:                pad(' ', current_fmt.width - length);
                    196:        while (--current_fmt.precision >= 0)
                    197:                putc(*cp++, current_fmt.iop);
                    198:        if (current_fmt.leftadj)
                    199:                pad(' ', current_fmt.width - length);
                    200: }
                    201: 
                    202: private void
                    203: pad(c, amount)
                    204: register int   c,
                    205:                amount;
                    206: {
                    207:        while (--amount >= 0)
                    208:                putc(c, current_fmt.iop);
                    209: }
                    210: 
                    211: private void
                    212: doformat(sp, fmt, ap)
                    213: register File  *sp;
                    214: register char  *fmt;
                    215: va_list        ap;
                    216: {
                    217:        register char   c;
                    218:        struct fmt_state        prev_fmt;
                    219: 
                    220:        prev_fmt = current_fmt;
                    221:        current_fmt.iop = sp;
                    222: 
                    223:        while (c = *fmt++) {
                    224:                if (c != '%') {
                    225:                        putc(c, current_fmt.iop);
                    226:                        continue;
                    227:                }
                    228: 
                    229:                current_fmt.padc = ' ';
                    230:                current_fmt.precision = current_fmt.leftadj = current_fmt.width = 0;
                    231:                c = *fmt++;
                    232:                if (c == '-') {
                    233:                        current_fmt.leftadj = YES;
                    234:                        c = *fmt++;
                    235:                }
                    236:                if (c == '0') {
                    237:                        current_fmt.padc = '0';
                    238:                        c = *fmt++;
                    239:                }
                    240:                while (c >= '0' && c <= '9') {
                    241:                        current_fmt.width = current_fmt.width * 10 + (c - '0');
                    242:                        c = *fmt++;
                    243:                }
                    244:                if (c == '*') {
                    245:                        current_fmt.width = va_arg(ap, int);
                    246:                        c = *fmt++;
                    247:                }
                    248:                if (c == '.') {
                    249:                        c = *fmt++;
                    250:                        while (c >= '0' && c <= '9') {
                    251:                                current_fmt.precision = current_fmt.precision * 10 + (c - '0');
                    252:                                c = *fmt++;
                    253:                        }
                    254:                        if (c == '*') {
                    255:                                current_fmt.precision = va_arg(ap, int);
                    256:                                c = *fmt++;
                    257:                        }
                    258:                }
                    259:        reswitch:
                    260:                /* At this point, fmt points at one past the format letter. */
                    261:                switch (c) {
                    262:                case '%':
                    263:                        putc('%', current_fmt.iop);
                    264:                        break;
                    265:        
                    266:                case 'O':
                    267:                case 'D':
                    268:                case 'X':
                    269:                        putld(va_arg(ap, long), (c == 'O') ? 8 :
                    270:                                                (c == 'D') ? 10 : 16);
                    271:                        break;
                    272:        
                    273:                case 'b':
                    274:                    {
                    275:                        Buffer  *b = va_arg(ap, Buffer *);
                    276: 
                    277:                        puts(b->b_name);
                    278:                        break;
                    279:                    }
                    280: 
                    281:                case 'c':
                    282:                        putc(va_arg(ap, int), current_fmt.iop);
                    283:                        break;
                    284:        
                    285:                case 'o':
                    286:                case 'd':
                    287:                case 'x':
                    288:                        putld((long) va_arg(ap, int), (c == 'o') ? 8 :
                    289:                                                (c == 'd') ? 10 : 16);
                    290:                        break;
                    291:        
                    292:                case 'f':       /* current command name gets inserted here! */
                    293:                        puts(LastCmd->Name);
                    294:                        break;
                    295: 
                    296:                case 'l':
                    297:                        c = CharUpcase(*++fmt);
                    298:                        goto reswitch;
                    299:        
                    300:                case 'n':
                    301:                        if (va_arg(ap, int) != 1)
                    302:                                puts("s");
                    303:                        break;
                    304: 
                    305:                case 'p':
                    306:                    {
                    307:                        char    cbuf[20];
                    308: 
                    309:                        PPchar(va_arg(ap, int), cbuf);
                    310:                        puts(cbuf);
                    311:                        break;
                    312:                    }
                    313: 
                    314:                case 's':
                    315:                        puts(va_arg(ap, char *));
                    316:                        break;
                    317:                
                    318:                default:
                    319:                        complain("Unknown format directive: \"%%%c\"", c);
                    320:                }
                    321:        }
                    322:        current_fmt = prev_fmt;
                    323: }
                    324: 
                    325: /* VARARGS1 */
                    326: 
                    327: char *
                    328: sprint(fmt, va_alist)
                    329: char   *fmt;
                    330: va_dcl
                    331: {
                    332:        va_list ap;
                    333:        static char     line[100];
                    334: 
                    335:        va_start(ap);
                    336:        format(line, sizeof line, fmt, ap);
                    337:        va_end(ap);
                    338:        return line;
                    339: }
                    340: 
                    341: /* VARARGS1 */
                    342: 
                    343: void
                    344: printf(fmt, va_alist)
                    345: char   *fmt;
                    346: va_dcl
                    347: {
                    348:        va_list ap;
                    349: 
                    350:        va_start(ap);
                    351: #ifndef IBMPC
                    352:        doformat(stdout, fmt, ap);
                    353: #else /* IBMPC */
                    354:        write_em(sprint(fmt, ap));
                    355:        /* doformat(stdout, fmt, ap); */
                    356: #endif /* IBMPC */
                    357:        va_end(ap);
                    358: }
                    359: 
                    360: /* VARARGS1 */
                    361: 
                    362: void
                    363: fprintf(fp, fmt, va_alist)
                    364: File   *fp;
                    365: char   *fmt;
                    366: va_dcl
                    367: {
                    368:        va_list ap;
                    369: 
                    370:        va_start(ap);
                    371:        doformat(fp, fmt, ap);
                    372:        va_end(ap);
                    373: }
                    374: 
                    375: /* VARARGS2 */
                    376: 
                    377: void
                    378: sprintf(str, fmt, va_alist)
                    379: char   *str,
                    380:        *fmt;
                    381: va_dcl
                    382: {
                    383:        va_list ap;
                    384: 
                    385:        va_start(ap);
                    386:        format(str, 130, fmt, ap);
                    387:        va_end(ap);
                    388: }
                    389: 
                    390: /* VARARGS1 */
                    391: 
                    392: void
                    393: s_mess(fmt, va_alist)
                    394: char   *fmt;
                    395: va_dcl
                    396: {
                    397:        va_list ap;
                    398: 
                    399:        if (InJoverc)
                    400:                return;
                    401:        va_start(ap);
                    402:        format(mesgbuf, sizeof mesgbuf, fmt, ap);
                    403:        va_end(ap);
                    404:        message(mesgbuf);
                    405: }
                    406: 
                    407: /* VARARGS1 */
                    408: 
                    409: void
                    410: f_mess(fmt, va_alist)
                    411: char   *fmt;
                    412: va_dcl
                    413: {
                    414:        va_list ap;
                    415: 
                    416:        va_start(ap);
                    417:        format(mesgbuf, sizeof mesgbuf, fmt, ap);
                    418:        va_end(ap);
                    419:        DrawMesg(NO);
                    420:        UpdMesg = YES;  /* still needs updating (for convenience) */
                    421: }
                    422: 
                    423: /* VARARGS1 */
                    424: 
                    425: void
                    426: add_mess(fmt, va_alist)
                    427: char   *fmt;
                    428: va_dcl
                    429: {
                    430:        int     mesg_len = strlen(mesgbuf);
                    431:        va_list ap;
                    432: 
                    433:        if (InJoverc)
                    434:                return;
                    435:        va_start(ap);
                    436:        format(&mesgbuf[mesg_len], (sizeof mesgbuf) - mesg_len, fmt, ap);
                    437:        va_end(ap);
                    438:        message(mesgbuf);
                    439: }

unix.superglobalmegacorp.com

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