Annotation of 43BSDTahoe/ucb/window/wwwrite.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1983 Regents of the University of California.
                      3:  * All rights reserved.
                      4:  *
                      5:  * Redistribution and use in source and binary forms are permitted
                      6:  * provided that the above copyright notice and this paragraph are
                      7:  * duplicated in all such forms and that any documentation,
                      8:  * advertising materials, and other materials related to such
                      9:  * distribution and use acknowledge that the software was developed
                     10:  * by the University of California, Berkeley.  The name of the
                     11:  * University may not be used to endorse or promote products derived
                     12:  * from this software without specific prior written permission.
                     13:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
                     14:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
                     15:  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     16:  */
                     17: 
                     18: #ifndef lint
                     19: static char sccsid[] = "@(#)wwwrite.c  3.28 (Berkeley) 6/29/88";
                     20: #endif /* not lint */
                     21: 
                     22: #include "ww.h"
                     23: #include "tt.h"
                     24: #include "char.h"
                     25: 
                     26: #define UPDATE() \
                     27:        if (!w->ww_noupdate && w->ww_cur.r >= 0 && w->ww_cur.r < wwnrow && \
                     28:            wwtouched[w->ww_cur.r]) \
                     29:                wwupdate1(w->ww_cur.r, w->ww_cur.r + 1)
                     30: 
                     31: /*
                     32:  * To support control character expansion, we save the old
                     33:  * p and q values in r and s, and point p at the beginning
                     34:  * of the expanded string, and q at some safe place beyond it
                     35:  * (p + 10).  At strategic points in the loops, we check
                     36:  * for (r && !*p) and restore the saved values back into
                     37:  * p and q.  Essentially, we implement a stack of depth 2,
                     38:  * to avoid recursion, which might be a better idea.
                     39:  */
                     40: wwwrite(w, p, n)
                     41: register struct ww *w;
                     42: register char *p;
                     43: int n;
                     44: {
                     45:        char hascursor;
                     46:        char *savep = p;
                     47:        char *q = p + n;
                     48:        char *r = 0;
                     49:        char *s;
                     50: 
                     51: #ifdef lint
                     52:        s = 0;                  /* define it before possible use */
                     53: #endif
                     54:        if (hascursor = w->ww_hascursor)
                     55:                wwcursor(w, 0);
                     56:        while (p < q && !w->ww_stopped && (!wwinterrupt() || w->ww_nointr)) {
                     57:                if (r && !*p) {
                     58:                        p = r;
                     59:                        q = s;
                     60:                        r = 0;
                     61:                        continue;
                     62:                }
                     63:                if (w->ww_wstate == 0 &&
                     64:                    (isprt(*p) || w->ww_unctrl && isunctrl(*p))) {
                     65:                        register i;
                     66:                        register union ww_char *bp;
                     67:                        int col, col1;
                     68: 
                     69:                        if (w->ww_insert) {     /* this is very slow */
                     70:                                if (*p == '\t') {
                     71:                                        p++;
                     72:                                        w->ww_cur.c += 8 -
                     73:                                                (w->ww_cur.c - w->ww_w.l & 7);
                     74:                                        goto chklf;
                     75:                                }
                     76:                                if (!isprt(*p)) {
                     77:                                        r = p + 1;
                     78:                                        s = q;
                     79:                                        p = unctrl(*p);
                     80:                                        q = p + 10;
                     81:                                }
                     82:                                wwinschar(w, w->ww_cur.r, w->ww_cur.c,
                     83:                                        *p++ | w->ww_modes << WWC_MSHIFT);
                     84:                                goto right;
                     85:                        }
                     86: 
                     87:                        bp = &w->ww_buf[w->ww_cur.r][w->ww_cur.c];
                     88:                        i = w->ww_cur.c;
                     89:                        while (i < w->ww_w.r && p < q)
                     90:                                if (!*p && r) {
                     91:                                        p = r;
                     92:                                        q = s;
                     93:                                        r = 0;
                     94:                                } else if (*p == '\t') {
                     95:                                        register tmp = 8 - (i - w->ww_w.l & 7);
                     96:                                        p++;
                     97:                                        i += tmp;
                     98:                                        bp += tmp;
                     99:                                } else if (isprt(*p)) {
                    100:                                        bp++->c_w = *p++
                    101:                                                | w->ww_modes << WWC_MSHIFT;
                    102:                                        i++;
                    103:                                } else if (w->ww_unctrl && isunctrl(*p)) {
                    104:                                        r = p + 1;
                    105:                                        s = q;
                    106:                                        p = unctrl(*p);
                    107:                                        q = p + 10;
                    108:                                } else
                    109:                                        break;
                    110:                        col = MAX(w->ww_cur.c, w->ww_i.l);
                    111:                        col1 = MIN(i, w->ww_i.r);
                    112:                        w->ww_cur.c = i;
                    113:                        if (w->ww_cur.r >= w->ww_i.t
                    114:                            && w->ww_cur.r < w->ww_i.b) {
                    115:                                register union ww_char *ns = wwns[w->ww_cur.r];
                    116:                                register char *smap = &wwsmap[w->ww_cur.r][col];
                    117:                                register char *win = w->ww_win[w->ww_cur.r];
                    118:                                int nchanged = 0;
                    119: 
                    120:                                bp = w->ww_buf[w->ww_cur.r];
                    121:                                for (i = col; i < col1; i++)
                    122:                                        if (*smap++ == w->ww_index) {
                    123:                                                nchanged++;
                    124:                                                ns[i].c_w = bp[i].c_w
                    125:                                                        ^ win[i] << WWC_MSHIFT;
                    126:                                        }
                    127:                                if (nchanged > 0)
                    128:                                        wwtouched[w->ww_cur.r] |= WWU_TOUCHED;
                    129:                        }
                    130:                chklf:
                    131:                        if (w->ww_cur.c >= w->ww_w.r)
                    132:                                goto crlf;
                    133:                } else switch (w->ww_wstate) {
                    134:                case 0:
                    135:                        switch (*p++) {
                    136:                        case '\n':
                    137:                                if (w->ww_mapnl)
                    138:                crlf:
                    139:                                        w->ww_cur.c = w->ww_w.l;
                    140:                lf:
                    141:                                UPDATE();
                    142:                                if (++w->ww_cur.r >= w->ww_w.b) {
                    143:                                        w->ww_cur.r = w->ww_w.b - 1;
                    144:                                        if (w->ww_w.b < w->ww_b.b) {
                    145:                                                (void) wwscroll1(w, w->ww_i.t,
                    146:                                                        w->ww_i.b, 1, 0);
                    147:                                                w->ww_buf++;
                    148:                                                w->ww_b.t--;
                    149:                                                w->ww_b.b--;
                    150:                                        } else
                    151:                                                wwdelline(w, w->ww_b.t);
                    152:                                }
                    153:                                break;
                    154:                        case '\b':
                    155:                                if (--w->ww_cur.c < w->ww_w.l) {
                    156:                                        w->ww_cur.c = w->ww_w.r - 1;
                    157:                                        goto up;
                    158:                                }
                    159:                                break;
                    160:                        case '\r':
                    161:                                w->ww_cur.c = w->ww_w.l;
                    162:                                break;
                    163:                        case ctrl('g'):
                    164:                                ttputc(ctrl('g'));
                    165:                                break;
                    166:                        case ctrl('['):
                    167:                                w->ww_wstate = 1;
                    168:                                break;
                    169:                        }
                    170:                        break;
                    171:                case 1:
                    172:                        w->ww_wstate = 0;
                    173:                        switch (*p++) {
                    174:                        case '@':
                    175:                                w->ww_insert = 1;
                    176:                                break;
                    177:                        case 'A':
                    178:                up:
                    179:                                UPDATE();
                    180:                                if (--w->ww_cur.r < w->ww_w.t) {
                    181:                                        w->ww_cur.r = w->ww_w.t;
                    182:                                        if (w->ww_w.t > w->ww_b.t) {
                    183:                                                (void) wwscroll1(w, w->ww_i.t,
                    184:                                                        w->ww_i.b, -1, 0);
                    185:                                                w->ww_buf--;
                    186:                                                w->ww_b.t++;
                    187:                                                w->ww_b.b++;
                    188:                                        } else
                    189:                                                wwinsline(w, w->ww_b.t);
                    190:                                }
                    191:                                break;
                    192:                        case 'B':
                    193:                                goto lf;
                    194:                        case 'C':
                    195:                right:
                    196:                                w->ww_cur.c++;
                    197:                                goto chklf;
                    198:                        case 'E':
                    199:                                w->ww_buf -= w->ww_w.t - w->ww_b.t;
                    200:                                w->ww_b.t = w->ww_w.t;
                    201:                                w->ww_b.b = w->ww_b.t + w->ww_b.nr;
                    202:                                w->ww_cur.r = w->ww_w.t;
                    203:                                w->ww_cur.c = w->ww_w.l;
                    204:                                wwclreos(w, w->ww_w.t, w->ww_w.l);
                    205:                                break;
                    206:                        case 'H':
                    207:                                UPDATE();
                    208:                                w->ww_cur.r = w->ww_w.t;
                    209:                                w->ww_cur.c = w->ww_w.l;
                    210:                                break;
                    211:                        case 'J':
                    212:                                wwclreos(w, w->ww_cur.r, w->ww_cur.c);
                    213:                                break;
                    214:                        case 'K':
                    215:                                wwclreol(w, w->ww_cur.r, w->ww_cur.c);
                    216:                                break;
                    217:                        case 'L':
                    218:                                UPDATE();
                    219:                                wwinsline(w, w->ww_cur.r);
                    220:                                break;
                    221:                        case 'M':
                    222:                                wwdelline(w, w->ww_cur.r);
                    223:                                break;
                    224:                        case 'N':
                    225:                                wwdelchar(w, w->ww_cur.r, w->ww_cur.c);
                    226:                                break;
                    227:                        case 'O':
                    228:                                w->ww_insert = 0;
                    229:                                break;
                    230:                        case 'Y':
                    231:                                UPDATE();
                    232:                                w->ww_wstate = 2;
                    233:                                break;
                    234:                        case 's':
                    235:                                w->ww_wstate = 4;
                    236:                                break;
                    237:                        case 'r':
                    238:                                w->ww_wstate = 5;
                    239:                                break;
                    240:                        }
                    241:                        break;
                    242:                case 2:
                    243:                        w->ww_cur.r = w->ww_w.t +
                    244:                                (unsigned)(*p++ - ' ') % w->ww_w.nr;
                    245:                        w->ww_wstate = 3;
                    246:                        break;
                    247:                case 3:
                    248:                        w->ww_cur.c = w->ww_w.l +
                    249:                                (unsigned)(*p++ - ' ') % w->ww_w.nc;
                    250:                        w->ww_wstate = 0;
                    251:                        break;
                    252:                case 4:
                    253:                        w->ww_modes |= *p++ & wwavailmodes;
                    254:                        w->ww_wstate = 0;
                    255:                        break;
                    256:                case 5:
                    257:                        w->ww_modes &= ~*p++;
                    258:                        w->ww_wstate = 0;
                    259:                        break;
                    260:                }
                    261:        }
                    262:        if (hascursor)
                    263:                wwcursor(w, 1);
                    264:        wwnwwr++;
                    265:        wwnwwra += n;
                    266:        n = p - savep;
                    267:        wwnwwrc += n;
                    268:        return n;
                    269: }

unix.superglobalmegacorp.com

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