Annotation of 43BSD/contrib/jove/fmt.c, revision 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.