|
|
1.1 root 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) 6/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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.