|
|
1.1 root 1: # include "curses.ext"
2: /* @(#) addch.c: 1.1 10/15/83 (1.5 11/18/82) */
3:
4: /*
5: * This routine prints the character in the current position.
6: * Think of it as putc.
7: *
8: * 3/5/81 (Berkeley) @(#)addch.c 1.3
9: */
10: waddch(win, c)
11: register WINDOW *win;
12: register chtype c;
13: {
14: register int x, y;
15: char *uctr;
16: register char rawc = c & A_CHARTEXT;
17:
18: x = win->_curx;
19: y = win->_cury;
20: # ifdef DEBUG
21: if (outf)
22: if (c == rawc)
23: fprintf(outf, "'%c'", rawc);
24: else
25: fprintf(outf, "'%c' %o, raw %o", c, c, rawc);
26: # endif
27: if (y >= win->_maxy || x >= win->_maxx || y < 0 || x < 0)
28: {
29: # ifdef DEBUG
30: if(outf)
31: {
32: fprintf(outf,"off edge, (%d,%d) not in (%d,%d)\n",y,x,win->_maxy,win->_maxx);
33: }
34: # endif
35: return ERR;
36: }
37: switch( rawc )
38: {
39: case '\t':
40: {
41: register int newx;
42:
43: for( newx = x + (8 - (x & 07)); x < newx; x++ )
44: {
45: if( waddch(win, ' ') == ERR )
46: {
47: return ERR;
48: }
49: }
50: return OK;
51: }
52: default:
53: if( rawc < ' ' || rawc > '~' )
54: {
55: uctr = unctrl(rawc);
56: waddch(win, (chtype)uctr[0]|(c&A_ATTRIBUTES));
57: waddch(win, (chtype)uctr[1]|(c&A_ATTRIBUTES));
58: return OK;
59: }
60: if( win->_attrs )
61: {
62: #ifdef DEBUG
63: if(outf) fprintf(outf, "(attrs %o, %o=>%o)", win->_attrs, c, c | win->_attrs);
64: #endif DEBUG
65: c |= win->_attrs;;
66: }
67: if( win->_y[y][x] != c )
68: {
69: if( win->_firstch[y] == _NOCHANGE )
70: {
71: win->_firstch[y] = win->_lastch[y] = x;
72: }
73: else
74: {
75: if( x < win->_firstch[y] )
76: {
77: win->_firstch[y] = x;
78: }
79: else
80: {
81: if( x > win->_lastch[y] )
82: {
83: win->_lastch[y] = x;
84: }
85: }
86: }
87: }
88: win->_y[y][x++] = c;
89: if (x >= win->_maxx)
90: {
91: x = 0;
92: new_line:
93: if (++y > win->_bmarg)
94: {
95: if (win->_scroll && !(win->_flags&_ISPAD))
96: {
97: #ifdef DEBUG
98: if(outf)
99: {
100: fprintf( outf, "Calling wrefresh( 0%o ) & _tscroll( 0%o )\n",
101: win, win );
102: }
103: #endif DEBUG
104: wrefresh(win);
105: _tscroll( win );
106: --y;
107: }
108: else
109: {
110: # ifdef DEBUG
111: int i;
112: if(outf)
113: {
114: fprintf(outf,
115: "ERR because (%d,%d) > (%d,%d)\n",
116: x, y, win->_maxx, win->_maxy);
117: fprintf(outf, "line: '");
118: for (i=0; i<win->_maxy; i++)
119: fprintf(outf, "%c",
120: win->_y[y-1][i]);
121: fprintf(outf, "'\n");
122: }
123: # endif DEBUG
124: return ERR;
125: }
126: }
127: }
128: # ifdef DEBUG
129: if(outf) fprintf(outf, "ADDCH: 2: y = %d, x = %d, firstch = %d, lastch = %d\n", y, x, win->_firstch[y], win->_lastch[y]);
130: # endif DEBUG
131: break;
132: case '\n':
133: wclrtoeol(win);
134: x = 0;
135: goto new_line;
136: case '\r':
137: x = 0;
138: break;
139: case '\b':
140: if (--x < 0)
141: x = 0;
142: break;
143: }
144: win->_curx = x;
145: win->_cury = y;
146: return OK;
147: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.