|
|
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.