|
|
1.1 root 1: # include "curses.ext"
2: # include <signal.h>
3: /* @(#) m_addch.c: 1.1 10/15/83 (1.3 12/16/82) */
4:
5: /*
6: * mini.c contains versions of curses routines for minicurses.
7: * They work just like their non-mini counterparts but draw on
8: * std_body rather than stdscr. This cuts down on overhead but
9: * restricts what you are allowed to do - you can't get stuff back
10: * from the screen and you can't use multiple windows or things
11: * like insert/delete line (the logical ones that affect the screen).
12: * All this but multiple windows could probably be added if somebody
13: * wanted to mess with it.
14: *
15: * 3/5/81 (Berkeley) @(#)addch.c 1.3
16: */
17: m_addch(c)
18: register chtype c;
19: {
20: register int x, y;
21: char *uctr;
22: register char rawc = c & A_CHARTEXT;
23:
24: #ifdef DEBUG
25: if (outf) fprintf(outf, "m_addch: [(%d,%d)] ", stdscr->_cury, stdscr->_curx);
26: #endif
27: x = stdscr->_curx;
28: y = stdscr->_cury;
29: # ifdef DEBUG
30: if (c == rawc)
31: if(outf) fprintf(outf, "'%c'", rawc);
32: else
33: if(outf) fprintf(outf, "'%c' %o, raw %o", c, c, rawc);
34: # endif
35: if (y >= stdscr->_maxy || x >= stdscr->_maxx || y < 0 || x < 0) {
36: return ERR;
37: }
38: switch (rawc) {
39: case '\t':
40: {
41: register int newx;
42:
43: for (newx = x + (8 - (x & 07)); x < newx; x++)
44: if (m_addch(' ') == ERR)
45: return ERR;
46: return OK;
47: }
48: default:
49: if (rawc < ' ' || rawc > '~') {
50: uctr = unctrl(rawc);
51: m_addch((chtype)uctr[0]|(c&A_ATTRIBUTES));
52: m_addch((chtype)uctr[1]|(c&A_ATTRIBUTES));
53: return OK;
54: }
55: if (stdscr->_attrs) {
56: #ifdef DEBUG
57: if(outf) fprintf(outf, "(attrs %o, %o=>%o)", stdscr->_attrs, c, c | stdscr->_attrs);
58: #endif
59: c |= stdscr->_attrs;;
60: }
61: /* This line actually puts it out. */
62: SP->virt_x++;
63: *(SP->curptr++) = c;
64: if (x >= stdscr->_maxx) {
65: x = 0;
66: new_line:
67: if (++y >= stdscr->_maxy)
68: if (stdscr->_scroll) {
69: _ll_refresh(stdscr->_use_idl);
70: _scrdown();
71: --y;
72: }
73: else {
74: # ifdef DEBUG
75: int i;
76: if(outf) fprintf(outf,
77: "ERR because (%d,%d) > (%d,%d)\n",
78: x, y, stdscr->_maxx, stdscr->_maxy);
79: if(outf) fprintf(outf, "line: '");
80: if(outf) for (i=0; i<stdscr->_maxy; i++)
81: fprintf(outf, "%c", stdscr->_y[y-1][i]);
82: if(outf) fprintf(outf, "'\n");
83: # endif
84: return ERR;
85: }
86: _ll_move(y, x);
87: }
88: # ifdef FULLDEBUG
89: if(outf) fprintf(outf, "ADDCH: 2: y = %d, x = %d, firstch = %d, lastch = %d\n", y, x, stdscr->_firstch[y], stdscr->_lastch[y]);
90: # endif
91: break;
92: case '\n':
93: # ifdef DEBUG
94: if (outf) fprintf(outf, "newline, y %d, lengths %d->%d, %d->%d, %d->%d\n", y, y, SP->std_body[y]->length, y+1, SP->std_body[y+1]->length, y+2, SP->std_body[y+2]->length);
95: # endif
96: if (SP->std_body[y+1])
97: SP->std_body[y+1]->length = x;
98: x = 0;
99: goto new_line;
100: case '\r':
101: x = 0;
102: break;
103: case '\b':
104: if (--x < 0)
105: x = 0;
106: break;
107: }
108: stdscr->_curx = x;
109: stdscr->_cury = y;
110: #ifdef DEBUG
111: if (outf) fprintf(outf, " => (%d,%d)]\n", stdscr->_cury, stdscr->_curx);
112: #endif
113: return OK;
114: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.