Annotation of 43BSDReno/usr.bin/window/xx.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1989 Regents of the University of California.
                      3:  * All rights reserved.
                      4:  *
                      5:  * This code is derived from software contributed to Berkeley by
                      6:  * Edward Wang at The University of California, Berkeley.
                      7:  *
                      8:  * Redistribution and use in source and binary forms are permitted provided
                      9:  * that: (1) source distributions retain this entire copyright notice and
                     10:  * comment, and (2) distributions including binaries display the following
                     11:  * acknowledgement:  ``This product includes software developed by the
                     12:  * University of California, Berkeley and its contributors'' in the
                     13:  * documentation or other materials provided with the distribution and in
                     14:  * all advertising materials mentioning features or use of this software.
                     15:  * Neither the name of the University nor the names of its contributors may
                     16:  * be used to endorse or promote products derived from this software without
                     17:  * specific prior written permission.
                     18:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
                     19:  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
                     20:  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     21:  */
                     22: 
                     23: #ifndef lint
                     24: static char sccsid[] = "@(#)xx.c       3.6 (Berkeley) 6/6/90";
                     25: #endif /* not lint */
                     26: 
                     27: #include "ww.h"
                     28: #include "xx.h"
                     29: #include "tt.h"
                     30: 
                     31: xxinit()
                     32: {
                     33:        if (ttinit() < 0)
                     34:                return -1;
                     35:        xxbufsize = tt.tt_nrow * tt.tt_ncol * 2;
                     36:        /* ccinit may choose to change xxbufsize */
                     37:        if (tt.tt_ntoken > 0 && ccinit() < 0)
                     38:                return -1;
                     39:        xxbuf = malloc((unsigned) xxbufsize * sizeof *xxbuf);
                     40:        if (xxbuf == 0) {
                     41:                wwerrno = WWE_NOMEM;
                     42:                return -1;
                     43:        }
                     44:        xxbufp = xxbuf;
                     45:        xxbufe = xxbuf + xxbufsize;
                     46:        return 0;
                     47: }
                     48: 
                     49: xxstart()
                     50: {
                     51:        (*tt.tt_start)();
                     52:        if (tt.tt_ntoken > 0)
                     53:                ccstart();
                     54:        xxreset();                      /* might be a restart */
                     55: }
                     56: 
                     57: xxend()
                     58: {
                     59:        if (tt.tt_scroll_top != 0 || tt.tt_scroll_bot != tt.tt_nrow - 1)
                     60:                /* tt.tt_setscroll is known to be defined */
                     61:                (*tt.tt_setscroll)(0, tt.tt_nrow - 1);
                     62:        if (tt.tt_modes)
                     63:                (*tt.tt_setmodes)(0);
                     64:        if (tt.tt_scroll_down)
                     65:                (*tt.tt_scroll_down)(1);
                     66:        (*tt.tt_move)(tt.tt_nrow - 1, 0);
                     67:        if (tt.tt_ntoken > 0)
                     68:                ccend();
                     69:        (*tt.tt_end)();
                     70:        (*tt.tt_flush)();
                     71: }
                     72: 
                     73: struct xx *
                     74: xxalloc()
                     75: {
                     76:        register struct xx *xp;
                     77: 
                     78:        if (xxbufp > xxbufe)
                     79:                abort();
                     80:        if ((xp = xx_freelist) == 0)
                     81:                /* XXX can't deal with failure */
                     82:                xp = (struct xx *) malloc((unsigned) sizeof *xp);
                     83:        else
                     84:                xx_freelist = xp->link;
                     85:        if (xx_head == 0)
                     86:                xx_head = xp;
                     87:        else
                     88:                xx_tail->link = xp;
                     89:        xx_tail = xp;
                     90:        xp->link = 0;
                     91:        return xp;
                     92: }
                     93: 
                     94: xxfree(xp)
                     95:        register struct xx *xp;
                     96: {
                     97:        xp->link = xx_freelist;
                     98:        xx_freelist = xp;
                     99: }
                    100: 
                    101: xxmove(row, col)
                    102: {
                    103:        register struct xx *xp = xx_tail;
                    104: 
                    105:        if (xp == 0 || xp->cmd != xc_move) {
                    106:                xp = xxalloc();
                    107:                xp->cmd = xc_move;
                    108:        }
                    109:        xp->arg0 = row;
                    110:        xp->arg1 = col;
                    111: }
                    112: 
                    113: xxscroll(dir, top, bot)
                    114: {
                    115:        register struct xx *xp = xx_tail;
                    116: 
                    117:        if (xp != 0 && xp->cmd == xc_scroll &&
                    118:            xp->arg1 == top && xp->arg2 == bot &&
                    119:            (xp->arg0 < 0 && dir < 0 || xp->arg0 > 0 && dir > 0)) {
                    120:                xp->arg0 += dir;
                    121:                return;
                    122:        }
                    123:        xp = xxalloc();
                    124:        xp->cmd = xc_scroll;
                    125:        xp->arg0 = dir;
                    126:        xp->arg1 = top;
                    127:        xp->arg2 = bot;
                    128: }
                    129: 
                    130: xxinschar(row, col, c, m)
                    131: {
                    132:        register struct xx *xp;
                    133: 
                    134:        xp = xxalloc();
                    135:        xp->cmd = xc_inschar;
                    136:        xp->arg0 = row;
                    137:        xp->arg1 = col;
                    138:        xp->arg2 = c;
                    139:        xp->arg3 = m;
                    140: }
                    141: 
                    142: xxinsspace(row, col)
                    143: {
                    144:        register struct xx *xp = xx_tail;
                    145: 
                    146:        if (xp != 0 && xp->cmd == xc_insspace && xp->arg0 == row &&
                    147:            col >= xp->arg1 && col <= xp->arg1 + xp->arg2) {
                    148:                xp->arg2++;
                    149:                return;
                    150:        }
                    151:        xp = xxalloc();
                    152:        xp->cmd = xc_insspace;
                    153:        xp->arg0 = row;
                    154:        xp->arg1 = col;
                    155:        xp->arg2 = 1;
                    156: }
                    157: 
                    158: xxdelchar(row, col)
                    159: {
                    160:        register struct xx *xp = xx_tail;
                    161: 
                    162:        if (xp != 0 && xp->cmd == xc_delchar &&
                    163:            xp->arg0 == row && xp->arg1 == col) {
                    164:                xp->arg2++;
                    165:                return;
                    166:        }
                    167:        xp = xxalloc();
                    168:        xp->cmd = xc_delchar;
                    169:        xp->arg0 = row;
                    170:        xp->arg1 = col;
                    171:        xp->arg2 = 1;
                    172: }
                    173: 
                    174: xxclear()
                    175: {
                    176:        register struct xx *xp;
                    177: 
                    178:        xxreset();
                    179:        xp = xxalloc();
                    180:        xp->cmd = xc_clear;
                    181: }
                    182: 
                    183: xxclreos(row, col)
                    184: {
                    185:        register struct xx *xp = xxalloc();
                    186: 
                    187:        xp->cmd = xc_clreos;
                    188:        xp->arg0 = row;
                    189:        xp->arg1 = col;
                    190: }
                    191: 
                    192: xxclreol(row, col)
                    193: {
                    194:        register struct xx *xp = xxalloc();
                    195: 
                    196:        xp->cmd = xc_clreol;
                    197:        xp->arg0 = row;
                    198:        xp->arg1 = col;
                    199: }
                    200: 
                    201: xxwrite(row, col, p, n, m)
                    202:        char *p;
                    203: {
                    204:        register struct xx *xp;
                    205: 
                    206:        if (xxbufp + n + 1 > xxbufe)
                    207:                xxflush(0);
                    208:        xp = xxalloc();
                    209:        xp->cmd = xc_write;
                    210:        xp->arg0 = row;
                    211:        xp->arg1 = col;
                    212:        xp->arg2 = n;
                    213:        xp->arg3 = m;
                    214:        xp->buf = xxbufp;
                    215:        bcopy(p, xxbufp, n);
                    216:        xxbufp += n;
                    217:        *xxbufp++ = char_sep;
                    218: }
                    219: 
                    220: xxreset()
                    221: {
                    222:        register struct xx *xp, *xq;
                    223: 
                    224:        for (xp = xx_head; xp != 0; xp = xq) {
                    225:                xq = xp->link;
                    226:                xxfree(xp);
                    227:        }
                    228:        xx_tail = xx_head = 0;
                    229:        xxbufp = xxbuf;
                    230: }

unix.superglobalmegacorp.com

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