# 2.11BSD#431 - /usr/src/ucb/window/wwupdate.c

##### Functions

    wwupdate1         X

       1: #ifndef lint
       2: static char sccsid[] = "@(#)wwupdate.c	3.16 4/24/85";
       3: #endif
       4:
       5: /*
       6:  * Copyright (c) 1983 Regents of the University of California,
       7:  * All rights reserved.  Redistribution permitted subject to
       8:  * the terms of the Berkeley Software License Agreement.
       9:  */
      10:
      11: #include "ww.h"
      12: #include "tt.h"
      13:
      14: wwupdate1(top, bot)
      15: {
      16:     int i;
      17:     register j;
      18:     register union ww_char *ns, *os;
      19:     char *touched;
      20:     char didit;
      21:
      22:     wwnupdate++;
      23:     for (i = top, touched = &wwtouched[i]; i < bot && !wwinterrupt();
      24:          i++, touched++) {
      25:         if (!*touched)
      26:             continue;
      27:         if (*touched & WWU_MAJOR && tt.tt_clreol != 0) {
      28:             register gain = 0;
      29:             register best_gain = 0;
      30:             register best;
      31:
      32:             wwnmajline++;
      33:             j = wwncol;
      34:             ns = &wwns[i][j];
      35:             os = &wwos[i][j];
      36:             while (--j >= 0) {
      37:                 /*
      38: 				 * The cost of clearing is:
      39: 				 *	ncol - nblank + X
      40: 				 * The cost of straight update is:
      41: 				 *	ncol - nsame
      42: 				 * We clear if:  nblank - nsame > X
      43: 				 * X is the clreol overhead.
      44: 				 * So we make gain = nblank - nsame.
      45: 				 */
      46:                 if ((--ns)->c_w == (--os)->c_w)
      47:                     gain--;
      48:                 else
      49:                     best_gain--;
      50:                 if (ns->c_w == ' ')
      51:                     gain++;
      52:                 if (gain >= best_gain) {
      53:                     best = j;
      54:                     best_gain = gain;
      55:                 }
      56:             }
      57:             if (best_gain > 4) {
      58:                 (*tt.tt_move)(i, best);
      59:                 (*tt.tt_clreol)();
      60:                 for (j = wwncol - best, os = &wwos[i][best];
      61:                      --j >= 0;)
      62:                     os++->c_w = ' ';
      63:             } else
      64:                 wwnmajmiss++;
      65:         }
      66:         *touched = 0;
      67:         wwnupdline++;
      68:         didit = 0;
      69:         ns = wwns[i];
      70:         os = wwos[i];
      71:         for (j = 0; j < wwncol;) {
      72:             register char *p, *q;
      73:             char m;
      74:             int c;
      75:             register n;
      76:             char buf[512];          /* > wwncol */
      77:             union ww_char lastc;
      78:
      79:             for (; j++ < wwncol && ns++->c_w == os++->c_w;)
      80:                 ;
      81:             if (j > wwncol)
      82:                 break;
      83:             p = buf;
      84:             m = ns[-1].c_m & tt.tt_availmodes;
      85:             c = j - 1;
      86:             os[-1] = ns[-1];
      87:             *p++ = ns[-1].c_c;
      88:             n = 5;
      89:             q = p;
      90:             while (j < wwncol && (ns->c_m&tt.tt_availmodes) == m) {
      91:                 *p++ = ns->c_c;
      92:                 if (ns->c_w == os->c_w) {
      93:                     if (--n <= 0)
      94:                         break;
      95:                     os++;
      96:                     ns++;
      97:                 } else {
      98:                     n = 5;
      99:                     q = p;
     100:                     lastc = *os;
     101:                     *os++ = *ns++;
     102:                 }
     103:                 j++;
     104:             }
     105:             tt.tt_nmodes = m;
     106:             if (wwwrap
     107:                 && i == wwnrow - 1 && q - buf + c == wwncol) {
     108:                 if (tt.tt_hasinsert) {
     109:                     if (q - buf != 1) {
     110:                         (*tt.tt_move)(i, c);
     111:                         (*tt.tt_write)(buf + 1,
     112:                             q - buf - 1);
     113:                         (*tt.tt_move)(i, c);
     114:                         tt.tt_ninsert = 1;
     115:                         (*tt.tt_write)(buf, 1);
     116:                         tt.tt_ninsert = 0;
     117:                     } else {
     118:                         (*tt.tt_move)(i, c - 1);
     119:                         (*tt.tt_write)(buf, 1);
     120:                         tt.tt_nmodes = ns[-2].c_m;
     121:                         (*tt.tt_move)(i, c - 1);
     122:                         tt.tt_ninsert = 1;
     123:                         (*tt.tt_write)(&ns[-2].c_c, 1);
     124:                         tt.tt_ninsert = 0;
     125:                     }
     126:                 } else {
     127:                     if (q - buf > 1) {
     128:                         (*tt.tt_move)(i, c);
     129:                         (*tt.tt_write)(buf, q-buf-1);
     130:                     }
     131:                     os[-1] = lastc;
     132:                     *touched = WWU_TOUCHED;
     133:                 }
     134:             } else {
     135:                 (*tt.tt_move)(i, c);
     136:                 (*tt.tt_write)(buf, q - buf);
     137:             }
     138:             didit++;
     139:         }
     140:         if (!didit)
     141:             wwnupdmiss++;
     142:     }
     143: }

#### Defined functions

wwupdate1 defined in line 14; used 2 times

- in /usr/src/ucb/window/ww.h line 217
- in /usr/src/ucb/window/wwwrite.c line 114

#### Defined variables

sccsid defined in line 2; never used

Last modified: 1987-02-17 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 522 |