new copyright notice
[unix-history] / usr / src / lib / libcurses / addbytes.c
CommitLineData
6a03cf08
GM
1/*
2 * Copyright (c) 1987 Regents of the University of California.
2f14f200
KB
3 * All rights reserved.
4 *
f1855e9f 5 * %sccs.include.redist.c%
6a03cf08
GM
6 */
7
8#ifndef lint
f1855e9f 9static char sccsid[] = "@(#)addbytes.c 5.4 (Berkeley) %G%";
2f14f200 10#endif /* not lint */
6a03cf08
GM
11
12# include "curses.ext"
13
14/*
15 * This routine adds the character to the current position
16 *
17 */
18waddbytes(win, bytes, count)
19reg WINDOW *win;
20reg char *bytes;
21reg int count;
22{
23#define SYNCH_OUT() {win->_cury = y; win->_curx = x;}
24#define SYNCH_IN() {y = win->_cury; x = win->_curx;}
25 reg int x, y;
26 reg int newx;
27
28 SYNCH_IN();
29# ifdef FULLDEBUG
30 fprintf(outf, "ADDBYTES('%c') at (%d, %d)\n", c, y, x);
31# endif
32 while (count--) {
33 register int c;
34 static char blanks[] = " ";
35
36 c = *bytes++;
37 switch (c) {
38 case '\t':
39 SYNCH_IN();
40 if (waddbytes(win, blanks, 8-(x%8)) == ERR) {
41 return ERR;
42 }
43 SYNCH_OUT();
44 break;
45
46 default:
47# ifdef FULLDEBUG
48 fprintf(outf, "ADDBYTES: 1: y = %d, x = %d, firstch = %d, lastch = %d\n", y, x, win->_firstch[y], win->_lastch[y]);
49# endif
50 if (win->_flags & _STANDOUT)
51 c |= _STANDOUT;
52 {
53# ifdef FULLDEBUG
54 fprintf(outf, "ADDBYTES(%0.2o, %d, %d)\n", win, y, x);
55# endif
56 if (win->_y[y][x] != c) {
57 newx = x + win->_ch_off;
58 if (win->_firstch[y] == _NOCHANGE) {
59 win->_firstch[y] =
60 win->_lastch[y] = newx;
61 } else if (newx < win->_firstch[y])
62 win->_firstch[y] = newx;
63 else if (newx > win->_lastch[y])
64 win->_lastch[y] = newx;
65# ifdef FULLDEBUG
66 fprintf(outf, "ADDBYTES: change gives f/l: %d/%d [%d/%d]\n",
67 win->_firstch[y], win->_lastch[y],
68 win->_firstch[y] - win->_ch_off,
69 win->_lastch[y] - win->_ch_off);
70# endif
71 }
72 }
73 win->_y[y][x++] = c;
74 if (x >= win->_maxx) {
75 x = 0;
76 newline:
77 if (++y >= win->_maxy)
78 if (win->_scroll) {
79 SYNCH_OUT();
80 scroll(win);
81 SYNCH_IN();
82 --y;
83 }
84 else
85 return ERR;
86 }
87# ifdef FULLDEBUG
88 fprintf(outf, "ADDBYTES: 2: y = %d, x = %d, firstch = %d, lastch = %d\n", y, x, win->_firstch[y], win->_lastch[y]);
89# endif
90 break;
91 case '\n':
92 SYNCH_OUT();
93 wclrtoeol(win);
94 SYNCH_IN();
95 if (!NONL)
96 x = 0;
97 goto newline;
98 case '\r':
99 x = 0;
100 break;
101 case '\b':
102 if (--x < 0)
103 x = 0;
104 break;
105 }
106 }
107 SYNCH_OUT();
108 return OK;
109}