|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.