96 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| #include <curses.h>
 | |
| #include "curspriv.h"
 | |
| 
 | |
| /****************************************************************/
 | |
| /* Newline() does line advance and returns the new cursor line.	*/
 | |
| /* If error, return -1.						*/
 | |
| /****************************************************************/
 | |
| 
 | |
| _PROTOTYPE( static short newline, (WINDOW *win, int lin));
 | |
| 
 | |
| static short newline(win, lin)
 | |
| WINDOW *win;
 | |
| int lin;
 | |
| {
 | |
|   if (++lin > win->_regbottom) {
 | |
| 	lin--;
 | |
| 	if (win->_scroll)
 | |
| 		scroll(win);
 | |
| 	else
 | |
| 		return(-1);
 | |
|   }				/* if */
 | |
|   return(lin);
 | |
| }				/* newline */
 | |
| 
 | |
| /****************************************************************/
 | |
| /* Waddch() inserts character 'c' at the current cursor posi-	*/
 | |
| /* Tion in window 'win', and takes any actions as dictated by	*/
 | |
| /* The character.						*/
 | |
| /****************************************************************/
 | |
| 
 | |
| int waddch(win, c)
 | |
| WINDOW *win;
 | |
| int c;
 | |
| {
 | |
|   int x = win->_curx;
 | |
|   int y = win->_cury;
 | |
|   int newx;
 | |
|   int ch = c;
 | |
|   int ts = win->_tabsize;
 | |
| 
 | |
|   ch &= (A_ALTCHARSET | 0xff);
 | |
|   if (y > win->_maxy || x > win->_maxx || y < 0 || x < 0) return(ERR);
 | |
|   switch (ch) {
 | |
|       case '\t':
 | |
| 	for (newx = ((x / ts) + 1) * ts; x < newx; x++) {
 | |
| 		if (waddch(win, ' ') == ERR) return(ERR);
 | |
| 		if (win->_curx == 0)	/* if tab to next line */
 | |
| 			return(OK);	/* exit the loop */
 | |
| 	}
 | |
| 	return(OK);
 | |
| 
 | |
|       case '\n':
 | |
| 	if (NONL) x = 0;
 | |
| 	if ((y = newline(win, y)) < 0) return (ERR);
 | |
| 	break;
 | |
| 
 | |
|       case '\r':	x = 0;	break;
 | |
| 
 | |
|       case '\b':
 | |
| 	if (--x < 0)		/* no back over left margin */
 | |
| 		x = 0;
 | |
| 	break;
 | |
| 
 | |
|       case 0x7f:
 | |
| 	{
 | |
| 		if (waddch(win, '^') == ERR) return(ERR);
 | |
| 		return(waddch(win, '?'));
 | |
| 	}
 | |
| 
 | |
|       default:
 | |
| 	if (ch < ' ') {		/* handle control chars */
 | |
| 		if (waddch(win, '^') == ERR) return(ERR);
 | |
| 		return(waddch(win, c + '@'));
 | |
| 	}
 | |
| 	ch |= (win->_attrs & ATR_MSK);
 | |
| 	if (win->_line[y][x] != ch) {	/* only if data change */
 | |
| 		if (win->_minchng[y] == _NO_CHANGE)
 | |
| 			win->_minchng[y] = win->_maxchng[y] = x;
 | |
| 		else if (x < win->_minchng[y])
 | |
| 			win->_minchng[y] = x;
 | |
| 		else if (x > win->_maxchng[y])
 | |
| 			win->_maxchng[y] = x;
 | |
| 	}			/* if */
 | |
| 	win->_line[y][x++] = ch;
 | |
| 	if (x > win->_maxx) {	/* wrap around test */
 | |
| 		x = 0;
 | |
| 		if ((y = newline(win, y)) < 0) return(ERR);
 | |
| 	}
 | |
| 	break;
 | |
| 
 | |
|   }				/* switch */
 | |
|   win->_curx = x;
 | |
|   win->_cury = y;
 | |
|   return(OK);
 | |
| }
 | 
