Thu, 23 Jul 2015 18:07:39 +0300
Added pdcurses source files, if no curses library is provided, these source files will be fallen back to instead of raising an error. Should make compiling on windows slightly less painful.
/* Public Domain Curses */ #include <curspriv.h> RCSID("$Id: border.c,v 1.53 2008/07/13 16:08:18 wmcbrine Exp $") /*man-start************************************************************** Name: border Synopsis: int border(chtype ls, chtype rs, chtype ts, chtype bs, chtype tl, chtype tr, chtype bl, chtype br); int wborder(WINDOW *win, chtype ls, chtype rs, chtype ts, chtype bs, chtype tl, chtype tr, chtype bl, chtype br); int box(WINDOW *win, chtype verch, chtype horch); int hline(chtype ch, int n); int vline(chtype ch, int n); int whline(WINDOW *win, chtype ch, int n); int wvline(WINDOW *win, chtype ch, int n); int mvhline(int y, int x, chtype ch, int n); int mvvline(int y, int x, chtype ch, int n); int mvwhline(WINDOW *win, int y, int x, chtype ch, int n); int mvwvline(WINDOW *win, int y, int x, chtype ch, int n); int border_set(const cchar_t *ls, const cchar_t *rs, const cchar_t *ts, const cchar_t *bs, const cchar_t *tl, const cchar_t *tr, const cchar_t *bl, const cchar_t *br); int wborder_set(WINDOW *win, const cchar_t *ls, const cchar_t *rs, const cchar_t *ts, const cchar_t *bs, const cchar_t *tl, const cchar_t *tr, const cchar_t *bl, const cchar_t *br); int box_set(WINDOW *win, const cchar_t *verch, const cchar_t *horch); int hline_set(const cchar_t *wch, int n); int vline_set(const cchar_t *wch, int n); int whline_set(WINDOW *win, const cchar_t *wch, int n); int wvline_set(WINDOW *win, const cchar_t *wch, int n); int mvhline_set(int y, int x, const cchar_t *wch, int n); int mvvline_set(int y, int x, const cchar_t *wch, int n); int mvwhline_set(WINDOW *win, int y, int x, const cchar_t *wch, int n); int mvwvline_set(WINDOW *win, int y, int x, const cchar_t *wch, int n); Description: border(), wborder(), and box() draw a border around the edge of the window. If any argument is zero, an appropriate default is used: ls left side of border ACS_VLINE rs right side of border ACS_VLINE ts top side of border ACS_HLINE bs bottom side of border ACS_HLINE tl top left corner of border ACS_ULCORNER tr top right corner of border ACS_URCORNER bl bottom left corner of border ACS_LLCORNER br bottom right corner of border ACS_LRCORNER hline() and whline() draw a horizontal line, using ch, starting from the current cursor position. The cursor position does not change. The line is at most n characters long, or as many as will fit in the window. vline() and wvline() draw a vertical line, using ch, starting from the current cursor position. The cursor position does not change. The line is at most n characters long, or as many as will fit in the window. Return Value: These functions return OK on success and ERR on error. Portability X/Open BSD SYS V border Y - 4.0 wborder Y - 4.0 box Y Y Y hline Y - 4.0 vline Y - 4.0 whline Y - 4.0 wvline Y - 4.0 mvhline Y mvvline Y mvwhline Y mvwvline Y border_set Y wborder_set Y box_set Y hline_set Y vline_set Y whline_set Y wvline_set Y mvhline_set Y mvvline_set Y mvwhline_set Y mvwvline_set Y **man-end****************************************************************/ /* _attr_passthru() -- Takes a single chtype 'ch' and checks if the current attribute of window 'win', as set by wattrset(), and/or the current background of win, as set by wbkgd(), should by combined with it. Attributes set explicitly in ch take precedence. */ static chtype _attr_passthru(WINDOW *win, chtype ch) { chtype attr; /* If the incoming character doesn't have its own attribute, then use the current attributes for the window. If the incoming character has attributes, but not a color component, OR the attributes to the current attributes for the window. If the incoming character has a color component, use only the attributes from the incoming character. */ attr = ch & A_ATTRIBUTES; if (!(attr & A_COLOR)) attr |= win->_attrs; /* wrs (4/10/93) -- Apply the same sort of logic for the window background, in that it only takes precedence if other color attributes are not there. */ if (!(attr & A_COLOR)) attr |= win->_bkgd & A_ATTRIBUTES; else attr |= win->_bkgd & (A_ATTRIBUTES ^ A_COLOR); ch = (ch & A_CHARTEXT) | attr; return ch; } int wborder(WINDOW *win, chtype ls, chtype rs, chtype ts, chtype bs, chtype tl, chtype tr, chtype bl, chtype br) { int i, ymax, xmax; PDC_LOG(("wborder() - called\n")); if (!win) return ERR; ymax = win->_maxy - 1; xmax = win->_maxx - 1; ls = _attr_passthru(win, ls ? ls : ACS_VLINE); rs = _attr_passthru(win, rs ? rs : ACS_VLINE); ts = _attr_passthru(win, ts ? ts : ACS_HLINE); bs = _attr_passthru(win, bs ? bs : ACS_HLINE); tl = _attr_passthru(win, tl ? tl : ACS_ULCORNER); tr = _attr_passthru(win, tr ? tr : ACS_URCORNER); bl = _attr_passthru(win, bl ? bl : ACS_LLCORNER); br = _attr_passthru(win, br ? br : ACS_LRCORNER); for (i = 1; i < xmax; i++) { win->_y[0][i] = ts; win->_y[ymax][i] = bs; } for (i = 1; i < ymax; i++) { win->_y[i][0] = ls; win->_y[i][xmax] = rs; } win->_y[0][0] = tl; win->_y[0][xmax] = tr; win->_y[ymax][0] = bl; win->_y[ymax][xmax] = br; for (i = 0; i <= ymax; i++) { win->_firstch[i] = 0; win->_lastch[i] = xmax; } PDC_sync(win); return OK; } int border(chtype ls, chtype rs, chtype ts, chtype bs, chtype tl, chtype tr, chtype bl, chtype br) { PDC_LOG(("border() - called\n")); return wborder(stdscr, ls, rs, ts, bs, tl, tr, bl, br); } int box(WINDOW *win, chtype verch, chtype horch) { PDC_LOG(("box() - called\n")); return wborder(win, verch, verch, horch, horch, 0, 0, 0, 0); } int whline(WINDOW *win, chtype ch, int n) { chtype *dest; int startpos, endpos; PDC_LOG(("whline() - called\n")); if (!win || n < 1) return ERR; startpos = win->_curx; endpos = min(startpos + n, win->_maxx) - 1; dest = win->_y[win->_cury]; ch = _attr_passthru(win, ch ? ch : ACS_HLINE); for (n = startpos; n <= endpos; n++) dest[n] = ch; n = win->_cury; if (startpos < win->_firstch[n] || win->_firstch[n] == _NO_CHANGE) win->_firstch[n] = startpos; if (endpos > win->_lastch[n]) win->_lastch[n] = endpos; PDC_sync(win); return OK; } int hline(chtype ch, int n) { PDC_LOG(("hline() - called\n")); return whline(stdscr, ch, n); } int mvhline(int y, int x, chtype ch, int n) { PDC_LOG(("mvhline() - called\n")); if (move(y, x) == ERR) return ERR; return whline(stdscr, ch, n); } int mvwhline(WINDOW *win, int y, int x, chtype ch, int n) { PDC_LOG(("mvwhline() - called\n")); if (wmove(win, y, x) == ERR) return ERR; return whline(win, ch, n); } int wvline(WINDOW *win, chtype ch, int n) { int endpos, x; PDC_LOG(("wvline() - called\n")); if (!win || n < 1) return ERR; endpos = min(win->_cury + n, win->_maxy); x = win->_curx; ch = _attr_passthru(win, ch ? ch : ACS_VLINE); for (n = win->_cury; n < endpos; n++) { win->_y[n][x] = ch; if (x < win->_firstch[n] || win->_firstch[n] == _NO_CHANGE) win->_firstch[n] = x; if (x > win->_lastch[n]) win->_lastch[n] = x; } PDC_sync(win); return OK; } int vline(chtype ch, int n) { PDC_LOG(("vline() - called\n")); return wvline(stdscr, ch, n); } int mvvline(int y, int x, chtype ch, int n) { PDC_LOG(("mvvline() - called\n")); if (move(y, x) == ERR) return ERR; return wvline(stdscr, ch, n); } int mvwvline(WINDOW *win, int y, int x, chtype ch, int n) { PDC_LOG(("mvwvline() - called\n")); if (wmove(win, y, x) == ERR) return ERR; return wvline(win, ch, n); } #ifdef PDC_WIDE int wborder_set(WINDOW *win, const cchar_t *ls, const cchar_t *rs, const cchar_t *ts, const cchar_t *bs, const cchar_t *tl, const cchar_t *tr, const cchar_t *bl, const cchar_t *br) { PDC_LOG(("wborder_set() - called\n")); return wborder(win, ls ? *ls : 0, rs ? *rs : 0, ts ? *ts : 0, bs ? *bs : 0, tl ? *tl : 0, tr ? *tr : 0, bl ? *bl : 0, br ? *br : 0); } int border_set(const cchar_t *ls, const cchar_t *rs, const cchar_t *ts, const cchar_t *bs, const cchar_t *tl, const cchar_t *tr, const cchar_t *bl, const cchar_t *br) { PDC_LOG(("border_set() - called\n")); return wborder_set(stdscr, ls, rs, ts, bs, tl, tr, bl, br); } int box_set(WINDOW *win, const cchar_t *verch, const cchar_t *horch) { PDC_LOG(("box_set() - called\n")); return wborder_set(win, verch, verch, horch, horch, (const cchar_t *)NULL, (const cchar_t *)NULL, (const cchar_t *)NULL, (const cchar_t *)NULL); } int whline_set(WINDOW *win, const cchar_t *wch, int n) { PDC_LOG(("whline_set() - called\n")); return wch ? whline(win, *wch, n) : ERR; } int hline_set(const cchar_t *wch, int n) { PDC_LOG(("hline_set() - called\n")); return whline_set(stdscr, wch, n); } int mvhline_set(int y, int x, const cchar_t *wch, int n) { PDC_LOG(("mvhline_set() - called\n")); if (move(y, x) == ERR) return ERR; return whline_set(stdscr, wch, n); } int mvwhline_set(WINDOW *win, int y, int x, const cchar_t *wch, int n) { PDC_LOG(("mvwhline_set() - called\n")); if (wmove(win, y, x) == ERR) return ERR; return whline_set(win, wch, n); } int wvline_set(WINDOW *win, const cchar_t *wch, int n) { PDC_LOG(("wvline_set() - called\n")); return wch ? wvline(win, *wch, n) : ERR; } int vline_set(const cchar_t *wch, int n) { PDC_LOG(("vline_set() - called\n")); return wvline_set(stdscr, wch, n); } int mvvline_set(int y, int x, const cchar_t *wch, int n) { PDC_LOG(("mvvline_set() - called\n")); if (move(y, x) == ERR) return ERR; return wvline_set(stdscr, wch, n); } int mvwvline_set(WINDOW *win, int y, int x, const cchar_t *wch, int n) { PDC_LOG(("mvwvline_set() - called\n")); if (wmove(win, y, x) == ERR) return ERR; return wvline_set(win, wch, n); } #endif