Commit | Line | Data |
---|---|---|
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 | 9 | static 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 | 22 | int |
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; | |
57 | newline: 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 | } |