|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: */ ! 6: ! 7: #ifndef lint ! 8: static char sccsid[] = "@(#)addch.c 5.1 (Berkeley) 6/7/85"; ! 9: #endif not lint ! 10: ! 11: # include "curses.ext" ! 12: ! 13: /* ! 14: * This routine adds the character to the current position ! 15: * ! 16: */ ! 17: waddch(win, c) ! 18: reg WINDOW *win; ! 19: char c; ! 20: { ! 21: reg int x, y; ! 22: reg WINDOW *wp; ! 23: reg int newx; ! 24: ! 25: x = win->_curx; ! 26: y = win->_cury; ! 27: # ifdef FULLDEBUG ! 28: fprintf(outf, "ADDCH('%c') at (%d, %d)\n", c, y, x); ! 29: # endif ! 30: switch (c) { ! 31: case '\t': ! 32: for (newx = x + (8 - (x & 07)); x < newx; x++) ! 33: if (waddch(win, ' ') == ERR) ! 34: return ERR; ! 35: return OK; ! 36: ! 37: default: ! 38: # ifdef FULLDEBUG ! 39: fprintf(outf, "ADDCH: 1: y = %d, x = %d, firstch = %d, lastch = %d\n", y, x, win->_firstch[y], win->_lastch[y]); ! 40: # endif ! 41: if (win->_flags & _STANDOUT) ! 42: c |= _STANDOUT; ! 43: set_ch(win, y, x, c); ! 44: win->_y[y][x++] = c; ! 45: if (x >= win->_maxx) { ! 46: x = 0; ! 47: newline: ! 48: if (++y >= win->_maxy) ! 49: if (win->_scroll) { ! 50: scroll(win); ! 51: --y; ! 52: } ! 53: else ! 54: return ERR; ! 55: } ! 56: # ifdef FULLDEBUG ! 57: fprintf(outf, "ADDCH: 2: y = %d, x = %d, firstch = %d, lastch = %d\n", y, x, win->_firstch[y], win->_lastch[y]); ! 58: # endif ! 59: break; ! 60: case '\n': ! 61: wclrtoeol(win); ! 62: if (!NONL) ! 63: x = 0; ! 64: goto newline; ! 65: case '\r': ! 66: x = 0; ! 67: break; ! 68: case '\b': ! 69: if (--x < 0) ! 70: x = 0; ! 71: break; ! 72: } ! 73: win->_curx = x; ! 74: win->_cury = y; ! 75: return OK; ! 76: } ! 77: ! 78: /* ! 79: * set_ch: ! 80: * Set the first and last change flags for this window. ! 81: */ ! 82: static ! 83: set_ch(win, y, x, ch) ! 84: reg WINDOW *win; ! 85: int y, x; ! 86: { ! 87: # ifdef FULLDEBUG ! 88: fprintf(outf, "SET_CH(%0.2o, %d, %d)\n", win, y, x); ! 89: # endif ! 90: if (win->_y[y][x] != ch) { ! 91: x += win->_ch_off; ! 92: if (win->_firstch[y] == _NOCHANGE) ! 93: win->_firstch[y] = win->_lastch[y] = x; ! 94: else if (x < win->_firstch[y]) ! 95: win->_firstch[y] = x; ! 96: else if (x > win->_lastch[y]) ! 97: win->_lastch[y] = x; ! 98: # ifdef FULLDEBUG ! 99: fprintf(outf, "SET_CH: change gives f/l: %d/%d [%d/%d]\n", ! 100: win->_firstch[y], win->_lastch[y], ! 101: win->_firstch[y] - win->_ch_off, ! 102: win->_lastch[y] - win->_ch_off); ! 103: # endif ! 104: } ! 105: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.