Annotation of researchv10dc/ncurses/screen/tputs.c, revision 1.1

1.1     ! root        1: /* Copyright (c) 1979 Regents of the University of California */
        !             2: static  char sccsid[] = "@(#)tputs.c   1.1     (1.9    3/6/83)";
        !             3: #include <ctype.h>
        !             4: #include "curses.h"
        !             5: #include "term.h"
        !             6: #ifdef NONSTANDARD
        !             7: # include "ns_curses.h"
        !             8: #endif
        !             9: 
        !            10: /*
        !            11:  * Put the character string cp out, with padding.
        !            12:  * The number of affected lines is affcnt, and the routine
        !            13:  * used to output one character is outc.
        !            14:  */
        !            15: tputs(cp, affcnt, outc)
        !            16:        register char *cp;
        !            17:        int affcnt;
        !            18:        int (*outc)();
        !            19: {
        !            20:        /* static (11 cc gripes) */ char *_tpad();
        !            21: 
        !            22:        if (cp == 0)
        !            23:                return;
        !            24: 
        !            25:        /*
        !            26:         * The guts of the string.
        !            27:         */
        !            28:        while (*cp)
        !            29:                if (*cp == '$' && cp[1] == '<')
        !            30:                        cp = _tpad(cp, affcnt, outc);
        !            31:                else
        !            32:                        (*outc)(*cp++);
        !            33: }
        !            34: 
        !            35: static char *
        !            36: _tpad(cp, affcnt, outc)
        !            37:        register char *cp;
        !            38:        int affcnt;
        !            39:        int (*outc)();
        !            40: {
        !            41:        register int delay = 0;
        !            42:        register int mspc10;
        !            43:        register char *icp = cp;
        !            44: 
        !            45:        /* Eat initial $< */
        !            46:        cp += 2;
        !            47: 
        !            48:        /*
        !            49:         * Convert the number representing the delay.
        !            50:         */
        !            51:        if (isdigit(*cp)) {
        !            52:                do
        !            53:                        delay = delay * 10 + *cp++ - '0';
        !            54:                while (isdigit(*cp));
        !            55:        }
        !            56:        delay *= 10;
        !            57:        if (*cp == '.') {
        !            58:                cp++;
        !            59:                if (isdigit(*cp))
        !            60:                        delay += *cp - '0';
        !            61:                /*
        !            62:                 * Only one digit to the right of the decimal point.
        !            63:                 */
        !            64:                while (isdigit(*cp))
        !            65:                        cp++;
        !            66:        }
        !            67: 
        !            68:        /*
        !            69:         * If the delay is followed by a `*', then
        !            70:         * multiply by the affected lines count.
        !            71:         */
        !            72:        if (*cp == '*')
        !            73:                cp++, delay *= affcnt;
        !            74:        if (*cp == '>')
        !            75:                cp++;   /* Eat trailing '>' */
        !            76:        else {
        !            77:                /*
        !            78:                 * We got a "$<" with no ">".  This is usually caused by
        !            79:                 * a cursor addressing sequence that happened to generate
        !            80:                 * $<.  To avoid an infinite loop, we output the $ here
        !            81:                 * and pass back the rest.
        !            82:                 */
        !            83:                (*outc)(*icp++);
        !            84:                return icp;
        !            85:        }
        !            86: 
        !            87:        /*
        !            88:         * If no delay needed, or output speed is
        !            89:         * not comprehensible, then don't try to delay.
        !            90:         */
        !            91:        if (delay == 0)
        !            92:                return cp;
        !            93:        /*
        !            94:         * Let handshaking take care of it - no extra cpu load from pads.
        !            95:         * Also, this will be more optimal since the pad info is usually
        !            96:         * worst case.  We only use padding info for such terminals to
        !            97:         * estimate the cost of a capability in choosing the cheapest one.
        !            98:         */
        !            99:        if (xon_xoff)
        !           100:                return cp;
        !           101:        (void) _delay(delay, outc);
        !           102:        return cp;
        !           103: }

unix.superglobalmegacorp.com

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