|
|
1.1 ! root 1: /* @(#) writechars.c: 1.1 10/15/83 (1.21 2/11/83) */ ! 2: ! 3: #include "curses.ext" ! 4: ! 5: char *tparm(); ! 6: ! 7: extern int _outch(); ! 8: ! 9: _writechars (start, end) ! 10: register char *start, *end; ! 11: { ! 12: register int c; ! 13: register char *p; ! 14: extern int didntdobotright; /* did not output char in corner */ ! 15: ! 16: #ifdef DEBUG ! 17: if(outf) fprintf(outf, "_writechars(%d:'", end-start+1); ! 18: if(outf) fwrite(start, sizeof (char), end-start+1, outf); ! 19: if(outf) fprintf(outf, "').\n"); ! 20: #endif DEBUG ! 21: _setmode (); ! 22: _sethl(); ! 23: while( start <= end ) ! 24: { ! 25: #ifdef FULLDEBUG ! 26: if(outf) fprintf(outf, "wc loop: repeat_char '%s', SP->phys_irm %d, *start '%c'\n", repeat_char, SP->phys_irm, *start); ! 27: #endif FULLDEBUG ! 28: if (repeat_char && SP->phys_irm != 1 && ! 29: ((p=start+1),*start==*p++) && (*start==*p++) && ! 30: (*start==*p++) && (*start==*p++) && p<=end) { ! 31: /* We have a run of at least 5 characters */ ! 32: c = 5; ! 33: while (p <= end && *start == *p++) ! 34: c++; ! 35: SP->phys_x += c; ! 36: /* Don't assume anything about how repeat and auto ! 37: * margins interact. The concept is different. */ ! 38: while (SP->phys_x >= columns-1 && auto_right_margin) { ! 39: c--; p--; SP->phys_x--; ! 40: } ! 41: #ifdef DEBUG ! 42: if(outf) fprintf(outf, "using repeat, count %d, char '%c'\n", c, *start); ! 43: #endif DEBUG ! 44: tputs(tparm(repeat_char, *start, c), c, _outch); ! 45: start = p-1; ! 46: if (*start == start[-1]) ! 47: start++; ! 48: continue; ! 49: } ! 50: c = *start++; ! 51: #ifdef DEBUG ! 52: if (outf) fprintf(outf, "c is '%c', phys_x %d, phys_y %d\n", c, SP->phys_x, SP->phys_y); ! 53: #endif DEBUG ! 54: if(SP->phys_irm == 1 && insert_character) ! 55: { ! 56: tputs(insert_character, columns-SP->phys_x, _outch); ! 57: } ! 58: /* ! 59: * If transparent_underline && !erase_overstrike, ! 60: * should probably do clr_eol. No such terminal yet. ! 61: */ ! 62: if(transparent_underline && erase_overstrike && ! 63: c == '_' && SP->phys_irm != 1) ! 64: { ! 65: _outch (' '); ! 66: tputs(cursor_left, 1, _outch); ! 67: } ! 68: if( ++SP->phys_x >= columns && auto_right_margin ) ! 69: { ! 70: /* Have to on c100 anyway..*/ ! 71: if( SP->phys_y >= lines-1 /*&& !eat_newline_glitch*/ ) ! 72: { ! 73: /* ! 74: * We attempted to put something in the last ! 75: * position of the last line. Since this will ! 76: * cause a scroll (we only get here if the ! 77: * terminal has auto_right_margin) we refuse ! 78: * to put it out. ! 79: */ ! 80: #ifdef DEBUG ! 81: if(outf) fprintf(outf,"Avoiding lower right corner\n"); ! 82: #endif ! 83: didntdobotright = 1; ! 84: SP->phys_x--; ! 85: return; ! 86: } ! 87: SP->phys_x = 0; ! 88: SP->phys_y++; ! 89: } ! 90: if( tilde_glitch && c == '~' ) ! 91: { ! 92: _outch('`'); ! 93: } ! 94: else ! 95: { ! 96: _outch (c); ! 97: } ! 98: /* Only 1 line can be affected by insert char here */ ! 99: if( SP->phys_irm == 1 && insert_padding ) ! 100: { ! 101: tputs(insert_padding, 1, _outch); ! 102: } ! 103: if( eat_newline_glitch && SP->phys_x == 0 ) ! 104: { ! 105: /* ! 106: * This handles both C100 and VT100, which are ! 107: * different. We don't output carriage_return ! 108: * and cursor_down because it might confuse a ! 109: * terminal that is looking for return and linefeed. ! 110: */ ! 111: _outch('\r'); ! 112: _outch('\n'); ! 113: } ! 114: } ! 115: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.