|
|
1.1 ! root 1: /* @(#) showstring.c: 1.1 10/15/83 (1.20 3/6/83) */ ! 2: ! 3: #include "curses.ext" ! 4: ! 5: /* ! 6: * Dump the string running from first to last out to the terminal. ! 7: * Take into account attributes, and attempt to take advantage of ! 8: * large pieces of white space and text that's already there. ! 9: * oldline is the old text of the line. ! 10: * ! 11: * Variable naming convention: *x means "extension", e.g. a rubber band ! 12: * that briefly looks ahead; *c means a character version of an otherwise ! 13: * chtype pointer; old means what was on the screen before this call; ! 14: * left means the char 1 space to the left. ! 15: */ ! 16: _showstring(sline, scol, first, last, oldlp) ! 17: int sline, scol; ! 18: chtype *first, *last; ! 19: struct line *oldlp; ! 20: { ! 21: register int hl = 0; /* nontrivial line, highlighted or with holes */ ! 22: int prevhl=SP->virt_gr, thishl; /* highlight state tty is in */ ! 23: register chtype *p, *px; /* current char being considered */ ! 24: register chtype *oldp, *oldpx; /* stuff under p and px */ ! 25: register char *pc, *pcx; /* like p, px but in char buffer */ ! 26: chtype *tailoldp; /* last valid oldp */ ! 27: int oldlen; /* length of old line */ ! 28: int lcol, lrow; /* position on screen */ ! 29: int oldc; /* char at oldp */ ! 30: int leftoldc, leftnewc; /* old & new chars to left of p */ ! 31: int diff_cookies; /* magic cookies changed */ ! 32: int diff_attrs; /* highlights changed */ ! 33: chtype *oldline; ! 34: #ifdef NONSTANDARD ! 35: static ! 36: #endif NONSTANDARD ! 37: char firstc[256], *lastc; /* char copy of input first, last */ ! 38: ! 39: #ifdef DEBUG ! 40: if(outf) fprintf(outf, "_showstring((%d,%d) %d:'", sline, scol, last-first+1); ! 41: if(outf) ! 42: for (p=first; p<=last; p++) { ! 43: thishl = *p & A_ATTRIBUTES; ! 44: if (thishl) ! 45: putc('\'', outf); ! 46: putc(*p & A_CHARTEXT, outf); ! 47: } ! 48: if(outf) fprintf(outf, "').\n"); ! 49: #endif ! 50: if (last-first > columns) { ! 51: _pos(lines-1, 0); ! 52: #ifndef NONSTANDARD ! 53: fprintf(stderr, "Bad call to _showstring, first %x, last %x,\ ! 54: diff %d\pcx\n", first, last, last-first); ! 55: #endif ! 56: abort(); ! 57: } ! 58: if (oldlp) { ! 59: oldline = oldlp->body; ! 60: oldp = oldline+scol; ! 61: } ! 62: else ! 63: oldp = 0; ! 64: for (p=first,lastc=firstc; p<=last; ) { ! 65: if (*p & A_ATTRIBUTES) ! 66: hl++; /* attributes on the line */ ! 67: if (oldp && (*oldp++ & A_ATTRIBUTES)) ! 68: hl++; /* attributes on old line */ ! 69: if (*p==' ' && (px=p+1,*px++==' ') && *px++==' ' && *px==' ') ! 70: hl++; /* a run of at least 4 blanks */ ! 71: *lastc++ = *p & A_CHARTEXT; ! 72: p++; /* On a separate line due to C optimizer bug */ ! 73: #ifdef FULLDEBUG ! 74: if(outf) fprintf(outf, "p %x '%c' %o, lastc %x %o, oldp %x %o, hl %d\n", p, p[-1], p[-1], lastc, lastc[-1], oldp, oldp ? oldp[-1] : 0, hl); ! 75: #endif ! 76: } ! 77: lastc--; ! 78: ! 79: lcol = scol; lrow = sline; ! 80: if (oldlp) { ! 81: oldline = oldlp->body; ! 82: oldlen = oldlp->length; ! 83: /* Check for runs of stuff that's already there. */ ! 84: for (p=first,oldp=oldline+lcol; p<=last; p++,oldp++) { ! 85: if (*p==*oldp && (px=p+1,oldpx=oldp+1,*px++==*oldpx++) ! 86: && *px++==*oldpx++ && *px==*oldpx) ! 87: hl++; /* a run of at least 4 matches */ ! 88: #ifdef FULLDEBUG ! 89: if(outf) fprintf(outf, "p %x '%c%c%c%c', oldp %x '%c%c%c%c', hl %d\n", ! 90: p, p[0], p[1], p[2], p[3], ! 91: oldp, oldp[0], oldp[1], oldp[2], oldp[3], ! 92: hl); ! 93: #endif ! 94: } ! 95: } else { ! 96: oldline = NULL; ! 97: oldlen = 0; ! 98: } ! 99: ! 100: if (!hl) { ! 101: /* Simple, common case. Do it fast. */ ! 102: _pos(lrow, lcol); ! 103: _hlmode(0); ! 104: _writechars(firstc, lastc); ! 105: return; ! 106: } ! 107: ! 108: #ifdef DEBUG ! 109: if(outf) fprintf(outf, "oldlp %x, oldline %x, oldlen %d 0x%x\n", oldlp, oldline, oldlen, oldlen); ! 110: if(outf) fprintf(outf, "old body('"); ! 111: if (oldlp) ! 112: for (p=oldline; p<=oldline+oldlen; p++) ! 113: if(outf) fprintf(outf, "%c", *p); ! 114: if(outf) fprintf(outf, "').\n"); ! 115: #endif ! 116: oldc = first[-1]; ! 117: tailoldp = oldline + oldlen; ! 118: for (p=first, oldp=oldline+lcol, pc=firstc; pc<=lastc; p++,oldp++,pc++) { ! 119: thishl = *p & A_ATTRIBUTES; ! 120: #ifdef DEBUG ! 121: if(outf) fprintf(outf, "prevhl %o, thishl %o\n", prevhl, thishl); ! 122: #endif ! 123: leftoldc = oldc & A_ATTRIBUTES; ! 124: leftnewc = p[-1] & A_ATTRIBUTES; ! 125: diff_cookies = magic_cookie_glitch>=0 && (leftoldc != leftnewc); ! 126: diff_attrs = ceol_standout_glitch>=0 && (((*p)&A_ATTRIBUTES) != leftnewc); ! 127: if (oldp >= tailoldp) ! 128: oldc = ' '; ! 129: else ! 130: oldc = *oldp; ! 131: #ifdef DEBUG ! 132: if(outf) fprintf(outf, "p %x *p %o, pc %x *pc %o, oldp %x, *oldp %o, lcol %d, lrow %d, oldc %o\n", p, *p, pc, *pc, oldp, *oldp, lcol, lrow, oldc); ! 133: #endif ! 134: if (*p != oldc || SP->virt_irm == 1 || diff_cookies || diff_attrs || ! 135: insert_null_glitch && oldp >= oldline+oldlen) { ! 136: register int n; ! 137: ! 138: _pos(lrow, lcol); ! 139: ! 140: /* ! 141: * HP 2645/2626: output new for each char. ! 142: * This forces it to be right no matter what ! 143: * was there before. ! 144: */ ! 145: if (ceol_standout_glitch && thishl == 0 && oldc&A_ATTRIBUTES) { ! 146: #ifdef FULLDEBUG ! 147: if(outf) fprintf(outf, ! 148: "ceol %d, thishl %d, prevhl %d\n", ! 149: ceol_standout_glitch, thishl, prevhl); ! 150: #endif ! 151: _forcehl(); ! 152: } ! 153: ! 154: /* Force highlighting to be right */ ! 155: _hlmode(thishl); ! 156: if (thishl != prevhl) { ! 157: if (magic_cookie_glitch >= 0) { ! 158: _sethl(); ! 159: p += magic_cookie_glitch; ! 160: oldp += magic_cookie_glitch; ! 161: pc += magic_cookie_glitch; ! 162: lcol += magic_cookie_glitch; ! 163: } ! 164: } ! 165: ! 166: /* ! 167: * Gather chunks of chars together, to be more ! 168: * efficient, and to allow repeats to be detected. ! 169: * Not done for blanks on cookie terminals because ! 170: * the last one might be a cookie. ! 171: */ ! 172: if (magic_cookie_glitch<0 || *pc != ' ') { ! 173: for (px=p+1,oldpx=oldp+1; ! 174: px<=last && *p==*px; ! 175: px++,oldpx++) { ! 176: if(!(repeat_char && oldpx<tailoldp && *p==*oldpx)) ! 177: break; ! 178: } ! 179: px--; oldpx--; ! 180: n = px - p; ! 181: pcx = pc + n; ! 182: } else { ! 183: n = 0; ! 184: pcx = pc; ! 185: } ! 186: _writechars(pc, pcx); ! 187: lcol += n; pc += n; p += n; oldp += n; ! 188: prevhl = thishl; ! 189: } ! 190: lcol++; ! 191: } ! 192: if (magic_cookie_glitch >= 0 && prevhl) { ! 193: /* Have to turn off highlighting at end of line */ ! 194: _hlmode(0); ! 195: _sethl(); ! 196: } ! 197: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.