Annotation of 43BSD/contrib/X/xterm/ansi.c, revision 1.1

1.1     ! root        1: #include <X/mit-copyright.h>
        !             2: 
        !             3: /* Copyright 1985 by the Massachusetts Institute of Technology */
        !             4: /*
        !             5:  * Parse and unparse ANSI sequences.
        !             6:  */
        !             7: #include       <stdio.h>
        !             8: #include       <X/Xlib.h>
        !             9: #include       "ptyx.h"
        !            10: 
        !            11: parseseq(c, ap, tek)
        !            12: register int   c;
        !            13: register ANSI  *ap;
        !            14: {
        !            15:        /*
        !            16:         * Start up sequence if this is a sequence introducer.
        !            17:         */
        !            18:        if (c==ESC || c==DCS || c==CSI || c==OSC || c==PM || c==APC) {
        !            19:                ap->a_type = c;
        !            20:                ap->a_pintro = 0;
        !            21:                ap->a_final = 0;
        !            22:                ap->a_inters = 0;
        !            23:                ap->a_nparam = 0;
        !            24:                ap->a_nastyf = 0;
        !            25:                return (-1);
        !            26:        }
        !            27:        /*
        !            28:         * Just pass the character through if not in a sequence.
        !            29:         */
        !            30:        if (ap->a_type == 0)
        !            31:                return (c);
        !            32:        /*
        !            33:         * Abort on C1 control, cancel or random communication error.
        !            34:         */
        !            35:        if ((c>=0x80 && c<=0x9F)) {
        !            36:                ap->a_type = 0;
        !            37:                ap->a_pintro = 0;
        !            38:                ap->a_final = 0;
        !            39:                return (c);
        !            40:        }
        !            41:        /*
        !            42:         * C0 control characters are passed through in the middle,
        !            43:         * except for a couple of special ones in Tek mode.
        !            44:         */
        !            45:        if (c<0x20 || c==DEL || c==RDEL) {
        !            46:                if (tek
        !            47:                    && ap->a_pintro==0
        !            48:                    && ap->a_final==0
        !            49:                    && ap->a_inters==0
        !            50:                    && ap->a_nparam==0
        !            51:                    && ap->a_nastyf==0) {
        !            52:                        if (ap->a_type==ESC && (c==FF || c==SUB || c==INQ))
        !            53:                                goto finalchar;
        !            54:                        if (ap->a_type==CSI && c==US)
        !            55:                                goto finalchar;
        !            56:                }
        !            57:                if (c==CAN || c==SUB) {
        !            58:                        ap->a_type = 0;
        !            59:                        ap->a_pintro = 0;
        !            60:                        ap->a_final = 0;
        !            61:                }
        !            62:                return (c);
        !            63:        }
        !            64:        c &= 0x7F;
        !            65:        /*
        !            66:         * Intermediate characters.
        !            67:         */
        !            68:        if (c>=0x20 && c<=0x2F) {
        !            69:                ap->a_inters <<= 8;
        !            70:                ap->a_inters |= c;
        !            71:                return (-1);
        !            72:        }
        !            73:        /*
        !            74:         * Parameter character in DCS, CSI, et al.
        !            75:         */
        !            76:        if (ap->a_type!=ESC && c>=0x30 && c<=0x3F) {
        !            77:                if (ap->a_inters != 0)
        !            78:                        ap->a_nastyf = 1;
        !            79:                /*
        !            80:                 * Only "?" and "<" are legal at Digital.
        !            81:                 */
        !            82:                if (c >= 0x3C) {
        !            83:                        if (ap->a_pintro != 0 || ap->a_nparam != 0)
        !            84:                                ap->a_nastyf = 1;
        !            85:                        ap->a_pintro = c;
        !            86:                        return (-1);
        !            87:                }
        !            88:                /*
        !            89:                 * set the default flag and init param value to 0
        !            90:                 * if we haven't seen any param's yet.
        !            91:                 */
        !            92:                if (ap->a_nparam == 0) {
        !            93:                        ap->a_dflt[ap->a_nparam] = 1;
        !            94:                        ap->a_param[ap->a_nparam++] = 0;
        !            95:                }
        !            96:                /*
        !            97:                 * ";" or ":", only the ";" is legal at Digital.
        !            98:                 */
        !            99:                if (c >= 0x3A) {
        !           100:                        if (c != 0x3B || ap->a_nparam >= NPARAM)
        !           101:                                ap->a_nastyf = 1;
        !           102:                        else {
        !           103:                                ap->a_dflt[ap->a_nparam] = 1;
        !           104:                                ap->a_param[ap->a_nparam++] = 0;
        !           105:                        }
        !           106:                        return (-1);
        !           107:                }
        !           108:                /*
        !           109:                 * Part of a numeric parameter.
        !           110:                 * Clear the default flag for this param.
        !           111:                 */
        !           112:                ap->a_dflt[ap->a_nparam-1] = 0;
        !           113:                ap->a_param[ap->a_nparam-1] *= 10;
        !           114:                ap->a_param[ap->a_nparam-1] += c - 0x30;
        !           115:                return (-1);
        !           116:        }
        !           117:        /*
        !           118:         * C1 control in its 7 bit ESC Fe representation.
        !           119:         */
        !           120:        if (ap->a_type==ESC && ap->a_inters==0 && c>=0x40 && c<=0x5F) {
        !           121:                c += 0x40;
        !           122:                /*
        !           123:                 * May need to start up a new sequence.
        !           124:                 */
        !           125:                if (c!=DCS && c!=CSI && c!=OSC && c!=PM && c!=APC) {
        !           126:                        ap->a_type = 0;
        !           127:                        ap->a_pintro = 0;
        !           128:                        ap->a_final = 0;
        !           129:                        return (c);
        !           130:                }
        !           131:                ap->a_type  = c;
        !           132:                ap->a_pintro = 0;
        !           133:                ap->a_final = 0;
        !           134:                ap->a_nastyf = 0;
        !           135:                return (-1);
        !           136:        }
        !           137:        /*
        !           138:         * Final character in sequence.
        !           139:         */
        !           140: finalchar:
        !           141:        ap->a_final = c;
        !           142:        return (ap->a_type);
        !           143: }
        !           144: 
        !           145: unparseseq(ap, tx8flag, fd)
        !           146: register ANSI  *ap;
        !           147: {
        !           148:        register int    c;
        !           149:        register int    i;
        !           150:        register int    inters;
        !           151: 
        !           152:        c = ap->a_type;
        !           153:        if (c>=0x80 && c<=0x9F && tx8flag==0) {
        !           154:                unparseputc(ESC, fd);
        !           155:                c -= 0x40;
        !           156:        }
        !           157:        unparseputc(c, fd);
        !           158:        c = ap->a_type;
        !           159:        if (c==ESC || c==DCS || c==CSI || c==OSC || c==PM || c==APC) {
        !           160:                if (ap->a_pintro != 0)
        !           161:                        unparseputc(ap->a_pintro, fd);
        !           162:                for (i=0; i<ap->a_nparam; ++i) {
        !           163:                        if (i != 0)
        !           164:                                unparseputc(';', fd);
        !           165:                        if (ap->a_param[i] != 0)
        !           166:                                unparseputn(ap->a_param[i], fd);
        !           167:                }
        !           168:                inters = ap->a_inters;
        !           169:                for (i=3; i>=0; --i)
        !           170:                        c = (inters >> (8*i)) & 0xff;
        !           171:                        if (c != 0)
        !           172:                                unparseputc(c, fd);
        !           173:                unparseputc(ap->a_final, fd);
        !           174:        }
        !           175: }
        !           176: 
        !           177: unparseputn(n, fd)
        !           178: unsigned int   n;
        !           179: {
        !           180:        unsigned int    q;
        !           181: 
        !           182:        q = n/10;
        !           183:        if (q != 0)
        !           184:                unparseputn(q, fd);
        !           185:        unparseputc((n%10) + '0', fd);
        !           186: }
        !           187: 
        !           188: unparseputc(c, fd)
        !           189: {
        !           190:        char    buf[1];
        !           191: 
        !           192:        buf[0] = c;
        !           193:        if (write(fd, buf, 1) != 1)
        !           194:                Panic("unparseputc: error writing character\n", 0);
        !           195: }

unix.superglobalmegacorp.com

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