Annotation of 43BSD/contrib/jove/fmt.c, revision 1.1.1.1

1.1       root        1: /*************************************************************************
                      2:  * This program is copyright (C) 1985, 1986 by Jonathan Payne.  It is    *
                      3:  * provided to you without charge for use only on a licensed Unix        *
                      4:  * system.  You may copy JOVE provided that this notice is included with *
                      5:  * the copy.  You may not sell copies of this program or versions        *
                      6:  * modified for use on microcomputer systems, unless the copies are      *
                      7:  * included with a Unix system distribution and the source is provided.  *
                      8:  *************************************************************************/
                      9: 
                     10: #include "jove.h"
                     11: #include "io.h"
                     12: #include "termcap.h"
                     13: 
                     14: #include <varargs.h>
                     15: 
                     16: char   mesgbuf[MESG_SIZE];
                     17: 
                     18: /* VARARGS2 */
                     19: 
                     20: format(buf, len, fmt, ap)
                     21: char   *buf,
                     22:        *fmt;
                     23: va_list        ap;
                     24: {
                     25:        File    strbuf,
                     26:                *sp = &strbuf;
                     27: 
                     28:        sp->f_ptr = sp->f_base = buf;
                     29:        sp->f_fd = -1;          /* Not legit for files */
                     30:        sp->f_cnt = len;
                     31:        sp->f_flags = F_STRING;
                     32:        sp->f_bufsize = len;
                     33: 
                     34:        doformat(sp, fmt, ap);
                     35:        putc('\0', sp);
                     36: }
                     37: 
                     38: static char    padc = ' ';
                     39: static File    *curiop = 0;
                     40: 
                     41: static
                     42: PPchar(c, str)
                     43: int    c;
                     44: char   *str;
                     45: {
                     46:        char    *cp = str;
                     47: 
                     48:        if (c == '\033')
                     49:                strcpy(cp, "ESC");
                     50:        else if (c < ' ')
                     51:                sprintf(cp, "C-%c", c + '@');
                     52:        else if (c == '\177')
                     53:                strcpy(cp, "^?");
                     54:        else
                     55:                sprintf(cp, "%c", c);
                     56: }
                     57: 
                     58: static
                     59: putld(leftadj, width, d, base)
                     60: long   d;
                     61: {
                     62:        int     length = 1;
                     63:        long    tmpd = d;
                     64: 
                     65:        while (tmpd = (tmpd / base))
                     66:                length++;
                     67:        if (d < 0)
                     68:                length++;
                     69:        if (!leftadj)
                     70:                pad(padc, width - length);
                     71:        if (d < 0) {
                     72:                putc('-', curiop);
                     73:                d = -d;
                     74:        }
                     75:        outld(d, base);
                     76:        if (leftadj)
                     77:                pad(padc, width - length);
                     78: }
                     79: 
                     80: static
                     81: outld(d, base)
                     82: long   d;
                     83: {
                     84:        long    n;
                     85: 
                     86:        if (n = (d / base))
                     87:                outld(n, base);
                     88:        putc((int) ('0' + (int) (d % base)), curiop);
                     89: }
                     90: 
                     91: static
                     92: puts(leftadj, width, str)
                     93: char   *str;
                     94: {
                     95:        int     length;
                     96:        register char   *cp,
                     97:                        c;
                     98: 
                     99:        if (str == 0)
                    100: #if pyr
                    101:                str = "";
                    102: #else
                    103:                str = "(null)";
                    104: #endif
                    105:        length = strlen(str);
                    106:        cp = str;
                    107:        if (!leftadj)
                    108:                pad(' ', width - length);
                    109:        while (c = *cp++)
                    110:                putc(c, curiop);
                    111:        if (leftadj)
                    112:                pad(' ', width - length);
                    113: }
                    114: 
                    115: static
                    116: pad(c, amount)
                    117: register int   c,
                    118:                amount;
                    119: {
                    120:        while (--amount >= 0)
                    121:                putc(c, curiop);
                    122: }
                    123: 
                    124: static
                    125: doformat(sp, fmt, ap)
                    126: register File  *sp;
                    127: register char  *fmt;
                    128: va_list        ap;
                    129: {
                    130:        register char   c;
                    131:        int     leftadj,
                    132:                width;
                    133:        File    *pushiop = curiop;
                    134: 
                    135:        curiop = sp;
                    136: 
                    137:        while (c = *fmt++) {
                    138:                if (c != '%') {
                    139:                        putc(c, sp);
                    140:                        continue;
                    141:                }
                    142: 
                    143:                padc = ' ';
                    144:                leftadj = width = 0;
                    145:                c = *fmt++;
                    146:                if (c == '-') {
                    147:                        leftadj++;
                    148:                        c = *fmt++;
                    149:                }
                    150:                if (c == '0') {
                    151:                        padc = '0';
                    152:                        c = *fmt++;
                    153:                }
                    154:                while (c >= '0' && c <= '9') {
                    155:                        width = width * 10 + (c - '0');
                    156:                        c = *fmt++;
                    157:                }
                    158:                if (c == '*') {
                    159:                        width = va_arg(ap, int);
                    160:                        c = *fmt++;
                    161:                }
                    162:        reswitch:
                    163:                /* At this point, fmt points at one past the format letter. */
                    164:                switch (c) {
                    165:                case 'l':
                    166:                        c = Upper(*++fmt);
                    167:                        goto reswitch;
                    168:        
                    169:                case '%':
                    170:                        putc('%', curiop);
                    171:                        break;
                    172:        
                    173:                case 'o':
                    174:                        putld(leftadj, width, (long) va_arg(ap, int), 8);
                    175:                        break;
                    176:        
                    177:                case 'd':
                    178:                        putld(leftadj, width, (long) va_arg(ap, int), 10);
                    179:                        break;
                    180:        
                    181:                case 'D':
                    182:                        putld(leftadj, width, va_arg(ap, long), 10);
                    183:                        break;
                    184:        
                    185:                case 'p':
                    186:                    {
                    187:                        char    cbuf[20];
                    188: 
                    189:                        PPchar(va_arg(ap, int), cbuf);
                    190:                        puts(leftadj, width, cbuf);
                    191:                        break;
                    192:                    }
                    193: 
                    194:                case 'n':
                    195:                        if (va_arg(ap, int) != 1)
                    196:                                puts(leftadj, width, "s");
                    197:                        break;
                    198: 
                    199:                case 's':
                    200:                        puts(leftadj, width, va_arg(ap, char *));
                    201:                        break;
                    202:                
                    203:                case 'c':
                    204:                        putc(va_arg(ap, int), curiop);
                    205:                        break;
                    206:        
                    207:                case 'f':       /* current command name gets inserted here! */
                    208:                        puts(leftadj, width, LastCmd->Name);
                    209:                        break;
                    210: 
                    211:                default:
                    212:                        complain("%%%c?", c);
                    213:                }
                    214:        }
                    215:        curiop = pushiop;
                    216: }
                    217: 
                    218: /* VARARGS1 */
                    219: 
                    220: char *
                    221: sprint(fmt, va_alist)
                    222: char   *fmt;
                    223: va_dcl
                    224: {
                    225:        va_list ap;
                    226:        static char     line[100];
                    227: 
                    228:        va_start(ap);
                    229:        format(line, sizeof line, fmt, ap);
                    230:        va_end(ap);
                    231:        return line;
                    232: }
                    233: 
                    234: /* VARARGS1 */
                    235: 
                    236: printf(fmt, va_alist)
                    237: char   *fmt;
                    238: va_dcl
                    239: {
                    240:        va_list ap;
                    241: 
                    242:        va_start(ap);
                    243:        doformat(stdout, fmt, ap);
                    244:        va_end(ap);
                    245: }
                    246: 
                    247: /* VARARGS1 */
                    248: 
                    249: fprintf(fp, fmt, va_alist)
                    250: File   *fp;
                    251: char   *fmt;
                    252: va_dcl
                    253: {
                    254:        va_list ap;
                    255: 
                    256:        va_start(ap);
                    257:        doformat(fp, fmt, ap);
                    258:        va_end(ap);
                    259: }
                    260: 
                    261: /* VARARGS2 */
                    262: 
                    263: sprintf(str, fmt, va_alist)
                    264: char   *str,
                    265:        *fmt;
                    266: va_dcl
                    267: {
                    268:        va_list ap;
                    269: 
                    270:        va_start(ap);
                    271:        format(str, 130, fmt, ap);
                    272:        va_end(ap);
                    273: }
                    274: 
                    275: /* VARARGS1 */
                    276: 
                    277: s_mess(fmt, va_alist)
                    278: char   *fmt;
                    279: va_dcl
                    280: {
                    281:        va_list ap;
                    282: 
                    283:        if (InJoverc)
                    284:                return;
                    285:        va_start(ap);
                    286:        format(mesgbuf, sizeof mesgbuf, fmt, ap);
                    287:        va_end(ap);
                    288:        message(mesgbuf);
                    289: }
                    290: 
                    291: /* VARARGS1 */
                    292: 
                    293: f_mess(fmt, va_alist)
                    294: char   *fmt;
                    295: va_dcl
                    296: {
                    297:        va_list ap;
                    298: 
                    299:        va_start(ap);
                    300:        format(mesgbuf, sizeof mesgbuf, fmt, ap);
                    301:        va_end(ap);
                    302:        DrawMesg(NO);
                    303:        UpdMesg++;      /* Still needs updating (for convenience) */
                    304: }
                    305: 
                    306: /* VARARGS1 */
                    307: 
                    308: add_mess(fmt, va_alist)
                    309: char   *fmt;
                    310: va_dcl
                    311: {
                    312:        int     mesg_len = strlen(mesgbuf);
                    313:        va_list ap;
                    314: 
                    315:        if (InJoverc)
                    316:                return;
                    317:        va_start(ap);
                    318:        format(&mesgbuf[mesg_len], (sizeof mesgbuf) - mesg_len, fmt, ap);
                    319:        va_end(ap);
                    320:        message(mesgbuf);
                    321: }

unix.superglobalmegacorp.com

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