4.4BSD snapshot (revision 8.1); add 1993 to copyright
[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
14a0061d 9static char sccsid[] = "@(#)addbytes.c 5.21 (Berkeley) %G%";
d5b26ce8 10#endif /* not lint */
6a03cf08 11
d5b26ce8 12#include <curses.h>
06e82095 13#include <termios.h>
d5b26ce8 14
0c5c5188
EA
15#define SYNCH_IN {y = win->cury; x = win->curx;}
16#define SYNCH_OUT {win->cury = y; win->curx = x;}
6a03cf08
GM
17
18/*
d5b26ce8
KB
19 * waddbytes --
20 * Add the character to the current position in the given window.
6a03cf08 21 */
a2af4b61 22int
1589e7d3 23__waddbytes(win, bytes, count, so)
d5b26ce8 24 register WINDOW *win;
6be6b30c 25 register const char *bytes;
d5b26ce8 26 register int count;
1589e7d3 27 int so;
6a03cf08 28{
d5b26ce8
KB
29 static char blanks[] = " ";
30 register int c, newx, x, y;
1589e7d3 31 char stand;
1c04a491 32 __LINE *lp;
6a03cf08 33
d5b26ce8 34 SYNCH_IN;
06e82095 35
d5b26ce8 36#ifdef DEBUG
14a0061d 37 __CTRACE("ADDBYTES('%c') at (%d, %d)\n", c, y, x);
d5b26ce8 38#endif
6a03cf08 39 while (count--) {
d5b26ce8
KB
40 c = *bytes++;
41 switch (c) {
42 case '\t':
0b090fcc 43 SYNCH_OUT;
79ec5a07
KB
44 if (waddbytes(win, blanks, 8 - (x % 8)) == ERR)
45 return (ERR);
0b090fcc 46 SYNCH_IN;
d5b26ce8 47 break;
6a03cf08 48
d5b26ce8 49 default:
d5b26ce8 50#ifdef DEBUG
14a0061d 51 __CTRACE("ADDBYTES(%0.2o, %d, %d)\n", win, y, x);
d5b26ce8 52#endif
0c5c5188 53
4a962744
EA
54 lp = win->lines[y];
55 if (lp->flags & __ISPASTEOL) {
56 lp->flags &= ~__ISPASTEOL;
57newline: if (y == win->maxy - 1) {
58 if (win->flags & __SCROLLOK) {
4a962744
EA
59 SYNCH_OUT;
60 scroll(win);
61 SYNCH_IN;
62 lp = win->lines[y];
1589e7d3 63 x = 0;
4a962744
EA
64 }
65 } else {
66 y++;
67 lp = win->lines[y];
68 x = 0;
69 }
370ce49f
CT
70 if (c == '\n')
71 break;
4a962744
EA
72 }
73
1589e7d3
EA
74 stand = '\0';
75 if (win->flags & __WSTANDOUT || so)
76 stand |= __STANDOUT;
4a962744 77#ifdef DEBUG
14a0061d 78 __CTRACE("ADDBYTES: 1: y = %d, x = %d, firstch = %d, lastch = %d\n",
556a4108 79 y, x, *win->lines[y]->firstchp, *win->lines[y]->lastchp);
4a962744 80#endif
1c04a491
EA
81 if (lp->line[x].ch != c ||
82 !(lp->line[x].attr & stand)) {
0c5c5188
EA
83 newx = x + win->ch_off;
84 if (!(lp->flags & __ISDIRTY)) {
85 lp->flags |= __ISDIRTY;
556a4108 86 *lp->firstchp = *lp->lastchp = newx;
0c5c5188 87 }
556a4108
EA
88 else if (newx < *lp->firstchp)
89 *lp->firstchp = newx;
90 else if (newx > *lp->lastchp)
91 *lp->lastchp = newx;
0b090fcc 92#ifdef DEBUG
14a0061d 93 __CTRACE("ADDBYTES: change gives f/l: %d/%d [%d/%d]\n",
556a4108
EA
94 *lp->firstchp, *lp->lastchp,
95 *lp->firstchp - win->ch_off,
96 *lp->lastchp - win->ch_off);
d5b26ce8
KB
97#endif
98 }
1c04a491 99 lp->line[x].ch = c;
1589e7d3 100 if (stand)
1c04a491 101 lp->line[x].attr |= __STANDOUT;
1589e7d3 102 else
1c04a491 103 lp->line[x].attr &= ~__STANDOUT;
4a962744
EA
104 if (x == win->maxx - 1)
105 lp->flags |= __ISPASTEOL;
106 else
107 x++;
d5b26ce8 108#ifdef DEBUG
14a0061d 109 __CTRACE("ADDBYTES: 2: y = %d, x = %d, firstch = %d, lastch = %d\n",
556a4108 110 y, x, *win->lines[y]->firstchp, *win->lines[y]->lastchp);
d5b26ce8
KB
111#endif
112 break;
113 case '\n':
114 SYNCH_OUT;
115 wclrtoeol(win);
116 SYNCH_IN;
32d9c6ee 117 if (__orig_termios.c_oflag & ONLCR)
d5b26ce8
KB
118 x = 0;
119 goto newline;
120 case '\r':
121 x = 0;
122 break;
123 case '\b':
124 if (--x < 0)
125 x = 0;
126 break;
127 }
128 }
129 SYNCH_OUT;
79ec5a07 130 return (OK);
6a03cf08 131}