[9] | 1 | #include <curses.h>
|
---|
| 2 | #include "curspriv.h"
|
---|
| 3 |
|
---|
| 4 | /****************************************************************/
|
---|
| 5 | /* Newline() does line advance and returns the new cursor line. */
|
---|
| 6 | /* If error, return -1. */
|
---|
| 7 | /****************************************************************/
|
---|
| 8 |
|
---|
| 9 | _PROTOTYPE( static short newline, (WINDOW *win, int lin));
|
---|
| 10 |
|
---|
| 11 | static short newline(win, lin)
|
---|
| 12 | WINDOW *win;
|
---|
| 13 | int lin;
|
---|
| 14 | {
|
---|
| 15 | if (++lin > win->_regbottom) {
|
---|
| 16 | lin--;
|
---|
| 17 | if (win->_scroll)
|
---|
| 18 | scroll(win);
|
---|
| 19 | else
|
---|
| 20 | return(-1);
|
---|
| 21 | } /* if */
|
---|
| 22 | return(lin);
|
---|
| 23 | } /* newline */
|
---|
| 24 |
|
---|
| 25 | /****************************************************************/
|
---|
| 26 | /* Waddch() inserts character 'c' at the current cursor posi- */
|
---|
| 27 | /* Tion in window 'win', and takes any actions as dictated by */
|
---|
| 28 | /* The character. */
|
---|
| 29 | /****************************************************************/
|
---|
| 30 |
|
---|
| 31 | int waddch(win, c)
|
---|
| 32 | WINDOW *win;
|
---|
| 33 | int c;
|
---|
| 34 | {
|
---|
| 35 | int x = win->_curx;
|
---|
| 36 | int y = win->_cury;
|
---|
| 37 | int newx;
|
---|
| 38 | int ch = c;
|
---|
| 39 | int ts = win->_tabsize;
|
---|
| 40 |
|
---|
| 41 | ch &= (A_ALTCHARSET | 0xff);
|
---|
| 42 | if (y > win->_maxy || x > win->_maxx || y < 0 || x < 0) return(ERR);
|
---|
| 43 | switch (ch) {
|
---|
| 44 | case '\t':
|
---|
| 45 | for (newx = ((x / ts) + 1) * ts; x < newx; x++) {
|
---|
| 46 | if (waddch(win, ' ') == ERR) return(ERR);
|
---|
| 47 | if (win->_curx == 0) /* if tab to next line */
|
---|
| 48 | return(OK); /* exit the loop */
|
---|
| 49 | }
|
---|
| 50 | return(OK);
|
---|
| 51 |
|
---|
| 52 | case '\n':
|
---|
| 53 | if (NONL) x = 0;
|
---|
| 54 | if ((y = newline(win, y)) < 0) return (ERR);
|
---|
| 55 | break;
|
---|
| 56 |
|
---|
| 57 | case '\r': x = 0; break;
|
---|
| 58 |
|
---|
| 59 | case '\b':
|
---|
| 60 | if (--x < 0) /* no back over left margin */
|
---|
| 61 | x = 0;
|
---|
| 62 | break;
|
---|
| 63 |
|
---|
| 64 | case 0x7f:
|
---|
| 65 | {
|
---|
| 66 | if (waddch(win, '^') == ERR) return(ERR);
|
---|
| 67 | return(waddch(win, '?'));
|
---|
| 68 | }
|
---|
| 69 |
|
---|
| 70 | default:
|
---|
| 71 | if (ch < ' ') { /* handle control chars */
|
---|
| 72 | if (waddch(win, '^') == ERR) return(ERR);
|
---|
| 73 | return(waddch(win, c + '@'));
|
---|
| 74 | }
|
---|
| 75 | ch |= (win->_attrs & ATR_MSK);
|
---|
| 76 | if (win->_line[y][x] != ch) { /* only if data change */
|
---|
| 77 | if (win->_minchng[y] == _NO_CHANGE)
|
---|
| 78 | win->_minchng[y] = win->_maxchng[y] = x;
|
---|
| 79 | else if (x < win->_minchng[y])
|
---|
| 80 | win->_minchng[y] = x;
|
---|
| 81 | else if (x > win->_maxchng[y])
|
---|
| 82 | win->_maxchng[y] = x;
|
---|
| 83 | } /* if */
|
---|
| 84 | win->_line[y][x++] = ch;
|
---|
| 85 | if (x > win->_maxx) { /* wrap around test */
|
---|
| 86 | x = 0;
|
---|
| 87 | if ((y = newline(win, y)) < 0) return(ERR);
|
---|
| 88 | }
|
---|
| 89 | break;
|
---|
| 90 |
|
---|
| 91 | } /* switch */
|
---|
| 92 | win->_curx = x;
|
---|
| 93 | win->_cury = y;
|
---|
| 94 | return(OK);
|
---|
| 95 | }
|
---|