|
|
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[] = "@(#)wwupdate.c 3.19 (Berkeley) 6/29/88"; ! 20: #endif /* not lint */ ! 21: ! 22: #include "ww.h" ! 23: #include "tt.h" ! 24: ! 25: wwupdate1(top, bot) ! 26: { ! 27: int i; ! 28: register j; ! 29: register union ww_char *ns, *os; ! 30: char *touched; ! 31: char didit; ! 32: ! 33: wwnupdate++; ! 34: for (i = top, touched = &wwtouched[i]; i < bot && !wwinterrupt(); ! 35: i++, touched++) { ! 36: if (!*touched) ! 37: continue; ! 38: if (*touched & WWU_MAJOR && tt.tt_clreol != 0) { ! 39: register gain = 0; ! 40: register best_gain = 0; ! 41: register best; ! 42: ! 43: wwnmajline++; ! 44: j = wwncol; ! 45: ns = &wwns[i][j]; ! 46: os = &wwos[i][j]; ! 47: while (--j >= 0) { ! 48: /* ! 49: * The cost of clearing is: ! 50: * ncol - nblank + X ! 51: * The cost of straight update is: ! 52: * ncol - nsame ! 53: * We clear if: nblank - nsame > X ! 54: * X is the clreol overhead. ! 55: * So we make gain = nblank - nsame. ! 56: */ ! 57: if ((--ns)->c_w == (--os)->c_w) ! 58: gain--; ! 59: else ! 60: best_gain--; ! 61: if (ns->c_w == ' ') ! 62: gain++; ! 63: if (gain >= best_gain) { ! 64: best = j; ! 65: best_gain = gain; ! 66: } ! 67: } ! 68: if (best_gain > 4) { ! 69: (*tt.tt_move)(i, best); ! 70: (*tt.tt_clreol)(); ! 71: for (j = wwncol - best, os = &wwos[i][best]; ! 72: --j >= 0;) ! 73: os++->c_w = ' '; ! 74: } else ! 75: wwnmajmiss++; ! 76: } ! 77: *touched = 0; ! 78: wwnupdline++; ! 79: didit = 0; ! 80: ns = wwns[i]; ! 81: os = wwos[i]; ! 82: for (j = 0; j < wwncol;) { ! 83: register char *p, *q; ! 84: char m; ! 85: int c; ! 86: register n; ! 87: char buf[512]; /* > wwncol */ ! 88: union ww_char lastc; ! 89: ! 90: for (; j++ < wwncol && ns++->c_w == os++->c_w;) ! 91: ; ! 92: if (j > wwncol) ! 93: break; ! 94: p = buf; ! 95: m = ns[-1].c_m; ! 96: c = j - 1; ! 97: os[-1] = ns[-1]; ! 98: *p++ = ns[-1].c_c; ! 99: n = 5; ! 100: q = p; ! 101: while (j < wwncol && ns->c_m == m) { ! 102: *p++ = ns->c_c; ! 103: if (ns->c_w == os->c_w) { ! 104: if (--n <= 0) ! 105: break; ! 106: os++; ! 107: ns++; ! 108: } else { ! 109: n = 5; ! 110: q = p; ! 111: lastc = *os; ! 112: *os++ = *ns++; ! 113: } ! 114: j++; ! 115: } ! 116: tt.tt_nmodes = m; ! 117: if (wwwrap ! 118: && i == wwnrow - 1 && q - buf + c == wwncol) { ! 119: if (tt.tt_hasinsert) { ! 120: if (q - buf != 1) { ! 121: (*tt.tt_move)(i, c); ! 122: (*tt.tt_write)(buf + 1, ! 123: q - buf - 1); ! 124: (*tt.tt_move)(i, c); ! 125: tt.tt_ninsert = 1; ! 126: (*tt.tt_write)(buf, 1); ! 127: tt.tt_ninsert = 0; ! 128: } else { ! 129: (*tt.tt_move)(i, c - 1); ! 130: (*tt.tt_write)(buf, 1); ! 131: tt.tt_nmodes = ns[-2].c_m; ! 132: (*tt.tt_move)(i, c - 1); ! 133: tt.tt_ninsert = 1; ! 134: (*tt.tt_write)(&ns[-2].c_c, 1); ! 135: tt.tt_ninsert = 0; ! 136: } ! 137: } else { ! 138: if (q - buf > 1) { ! 139: (*tt.tt_move)(i, c); ! 140: (*tt.tt_write)(buf, q-buf-1); ! 141: } ! 142: os[-1] = lastc; ! 143: *touched = WWU_TOUCHED; ! 144: } ! 145: } else { ! 146: (*tt.tt_move)(i, c); ! 147: (*tt.tt_write)(buf, q - buf); ! 148: } ! 149: didit++; ! 150: } ! 151: if (!didit) ! 152: wwnupdmiss++; ! 153: } ! 154: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.