xref: /original-bsd/lib/libcurses/addbytes.c (revision 65ba69af)
1 /*
2  * Copyright (c) 1987 Regents of the University of California.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms are permitted
6  * provided that the above copyright notice and this paragraph are
7  * duplicated in all such forms and that any documentation,
8  * advertising materials, and other materials related to such
9  * distribution and use acknowledge that the software was developed
10  * by the University of California, Berkeley.  The name of the
11  * University may not be used to endorse or promote products derived
12  * from this software without specific prior written permission.
13  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16  */
17 
18 #ifndef lint
19 static char sccsid[] = "@(#)addbytes.c	5.3 (Berkeley) 06/30/88";
20 #endif /* not lint */
21 
22 # include	"curses.ext"
23 
24 /*
25  *	This routine adds the character to the current position
26  *
27  */
28 waddbytes(win, bytes, count)
29 reg WINDOW	*win;
30 reg char	*bytes;
31 reg int		count;
32 {
33 #define	SYNCH_OUT()	{win->_cury = y; win->_curx = x;}
34 #define	SYNCH_IN()	{y = win->_cury; x = win->_curx;}
35 	reg int		x, y;
36 	reg int		newx;
37 
38 	SYNCH_IN();
39 # ifdef FULLDEBUG
40 	fprintf(outf, "ADDBYTES('%c') at (%d, %d)\n", c, y, x);
41 # endif
42 	while (count--) {
43 	    register int c;
44 	    static char blanks[] = "        ";
45 
46 	    c = *bytes++;
47 	    switch (c) {
48 	      case '\t':
49 		    SYNCH_IN();
50 		    if (waddbytes(win, blanks, 8-(x%8)) == ERR) {
51 			return ERR;
52 		    }
53 		    SYNCH_OUT();
54 		    break;
55 
56 	      default:
57 # ifdef FULLDEBUG
58 		    fprintf(outf, "ADDBYTES: 1: y = %d, x = %d, firstch = %d, lastch = %d\n", y, x, win->_firstch[y], win->_lastch[y]);
59 # endif
60 		    if (win->_flags & _STANDOUT)
61 			    c |= _STANDOUT;
62 		    {
63 # ifdef	FULLDEBUG
64 			    fprintf(outf, "ADDBYTES(%0.2o, %d, %d)\n", win, y, x);
65 # endif
66 			    if (win->_y[y][x] != c) {
67 				    newx = x + win->_ch_off;
68 				    if (win->_firstch[y] == _NOCHANGE) {
69 					    win->_firstch[y] =
70 							    win->_lastch[y] = newx;
71 				    } else if (newx < win->_firstch[y])
72 					    win->_firstch[y] = newx;
73 				    else if (newx > win->_lastch[y])
74 					    win->_lastch[y] = newx;
75 # ifdef FULLDEBUG
76 				    fprintf(outf, "ADDBYTES: change gives f/l: %d/%d [%d/%d]\n",
77 					    win->_firstch[y], win->_lastch[y],
78 					    win->_firstch[y] - win->_ch_off,
79 					    win->_lastch[y] - win->_ch_off);
80 # endif
81 			    }
82 		    }
83 		    win->_y[y][x++] = c;
84 		    if (x >= win->_maxx) {
85 			    x = 0;
86     newline:
87 			    if (++y >= win->_maxy)
88 				    if (win->_scroll) {
89 					    SYNCH_OUT();
90 					    scroll(win);
91 					    SYNCH_IN();
92 					    --y;
93 				    }
94 				    else
95 					    return ERR;
96 		    }
97 # ifdef FULLDEBUG
98 		    fprintf(outf, "ADDBYTES: 2: y = %d, x = %d, firstch = %d, lastch = %d\n", y, x, win->_firstch[y], win->_lastch[y]);
99 # endif
100 		    break;
101 	      case '\n':
102 		    SYNCH_OUT();
103 		    wclrtoeol(win);
104 		    SYNCH_IN();
105 		    if (!NONL)
106 			    x = 0;
107 		    goto newline;
108 	      case '\r':
109 		    x = 0;
110 		    break;
111 	      case '\b':
112 		    if (--x < 0)
113 			    x = 0;
114 		    break;
115 	    }
116     }
117     SYNCH_OUT();
118     return OK;
119 }
120