1*51ffecc1SBen Gras /* $NetBSD: line.c,v 1.6 2010/02/23 19:48:26 drochner Exp $ */
2*51ffecc1SBen Gras
3*51ffecc1SBen Gras /*-
4*51ffecc1SBen Gras * Copyright (c) 1998-1999 Brett Lymn
5*51ffecc1SBen Gras * (blymn@baea.com.au, brett_lymn@yahoo.com.au)
6*51ffecc1SBen Gras * All rights reserved.
7*51ffecc1SBen Gras *
8*51ffecc1SBen Gras * This code has been donated to The NetBSD Foundation by the Author.
9*51ffecc1SBen Gras *
10*51ffecc1SBen Gras * Redistribution and use in source and binary forms, with or without
11*51ffecc1SBen Gras * modification, are permitted provided that the following conditions
12*51ffecc1SBen Gras * are met:
13*51ffecc1SBen Gras * 1. Redistributions of source code must retain the above copyright
14*51ffecc1SBen Gras * notice, this list of conditions and the following disclaimer.
15*51ffecc1SBen Gras * 2. The name of the author may not be used to endorse or promote products
16*51ffecc1SBen Gras * derived from this software without specific prior written permission
17*51ffecc1SBen Gras *
18*51ffecc1SBen Gras * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19*51ffecc1SBen Gras * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20*51ffecc1SBen Gras * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21*51ffecc1SBen Gras * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22*51ffecc1SBen Gras * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23*51ffecc1SBen Gras * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*51ffecc1SBen Gras * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*51ffecc1SBen Gras * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*51ffecc1SBen Gras * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27*51ffecc1SBen Gras * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*51ffecc1SBen Gras *
29*51ffecc1SBen Gras *
30*51ffecc1SBen Gras */
31*51ffecc1SBen Gras
32*51ffecc1SBen Gras #include <sys/cdefs.h>
33*51ffecc1SBen Gras #ifndef lint
34*51ffecc1SBen Gras __RCSID("$NetBSD: line.c,v 1.6 2010/02/23 19:48:26 drochner Exp $");
35*51ffecc1SBen Gras #endif /* not lint */
36*51ffecc1SBen Gras
37*51ffecc1SBen Gras #include <string.h>
38*51ffecc1SBen Gras
39*51ffecc1SBen Gras #include "curses.h"
40*51ffecc1SBen Gras #include "curses_private.h"
41*51ffecc1SBen Gras
42*51ffecc1SBen Gras /*
43*51ffecc1SBen Gras * hline --
44*51ffecc1SBen Gras * Draw a horizontal line of character c on stdscr.
45*51ffecc1SBen Gras */
46*51ffecc1SBen Gras int
hline(chtype ch,int count)47*51ffecc1SBen Gras hline(chtype ch, int count)
48*51ffecc1SBen Gras {
49*51ffecc1SBen Gras return whline(stdscr, ch, count);
50*51ffecc1SBen Gras }
51*51ffecc1SBen Gras
52*51ffecc1SBen Gras /*
53*51ffecc1SBen Gras * mvhline --
54*51ffecc1SBen Gras * Move to location (y, x) and draw a horizontal line of character c
55*51ffecc1SBen Gras * on stdscr.
56*51ffecc1SBen Gras */
57*51ffecc1SBen Gras int
mvhline(int y,int x,chtype ch,int count)58*51ffecc1SBen Gras mvhline(int y, int x, chtype ch, int count)
59*51ffecc1SBen Gras {
60*51ffecc1SBen Gras return mvwhline(stdscr, y, x, ch, count);
61*51ffecc1SBen Gras }
62*51ffecc1SBen Gras
63*51ffecc1SBen Gras /*
64*51ffecc1SBen Gras * mvwhline --
65*51ffecc1SBen Gras * Move to location (y, x) and draw a horizontal line of character c
66*51ffecc1SBen Gras * in the given window.
67*51ffecc1SBen Gras */
68*51ffecc1SBen Gras int
mvwhline(WINDOW * win,int y,int x,chtype ch,int count)69*51ffecc1SBen Gras mvwhline(WINDOW *win, int y, int x, chtype ch, int count)
70*51ffecc1SBen Gras {
71*51ffecc1SBen Gras if (wmove(win, y, x) == ERR)
72*51ffecc1SBen Gras return ERR;
73*51ffecc1SBen Gras
74*51ffecc1SBen Gras return whline(win, ch, count);
75*51ffecc1SBen Gras }
76*51ffecc1SBen Gras
77*51ffecc1SBen Gras /*
78*51ffecc1SBen Gras * whline --
79*51ffecc1SBen Gras * Draw a horizontal line of character c in the given window moving
80*51ffecc1SBen Gras * towards the rightmost column. At most count characters are drawn
81*51ffecc1SBen Gras * or until the edge of the screen, whichever comes first.
82*51ffecc1SBen Gras */
83*51ffecc1SBen Gras int
whline(WINDOW * win,chtype ch,int count)84*51ffecc1SBen Gras whline(WINDOW *win, chtype ch, int count)
85*51ffecc1SBen Gras {
86*51ffecc1SBen Gras #ifndef HAVE_WCHAR
87*51ffecc1SBen Gras int ocurx, n, i;
88*51ffecc1SBen Gras
89*51ffecc1SBen Gras n = min(count, win->maxx - win->curx);
90*51ffecc1SBen Gras ocurx = win->curx;
91*51ffecc1SBen Gras
92*51ffecc1SBen Gras if (!(ch & __CHARTEXT))
93*51ffecc1SBen Gras ch |= ACS_HLINE;
94*51ffecc1SBen Gras for (i = 0; i < n; i++)
95*51ffecc1SBen Gras mvwaddch(win, win->cury, ocurx + i, ch);
96*51ffecc1SBen Gras
97*51ffecc1SBen Gras wmove(win, win->cury, ocurx);
98*51ffecc1SBen Gras return OK;
99*51ffecc1SBen Gras #else
100*51ffecc1SBen Gras cchar_t cch, *cchp;
101*51ffecc1SBen Gras
102*51ffecc1SBen Gras if (ch & __CHARTEXT) {
103*51ffecc1SBen Gras __cursesi_chtype_to_cchar(ch, &cch);
104*51ffecc1SBen Gras cchp = & cch;
105*51ffecc1SBen Gras } else
106*51ffecc1SBen Gras cchp = WACS_HLINE;
107*51ffecc1SBen Gras
108*51ffecc1SBen Gras return whline_set(win, cchp, count);
109*51ffecc1SBen Gras #endif
110*51ffecc1SBen Gras }
111*51ffecc1SBen Gras
112*51ffecc1SBen Gras /*
113*51ffecc1SBen Gras * vline --
114*51ffecc1SBen Gras * Draw a vertical line of character ch on stdscr.
115*51ffecc1SBen Gras */
116*51ffecc1SBen Gras int
vline(chtype ch,int count)117*51ffecc1SBen Gras vline(chtype ch, int count)
118*51ffecc1SBen Gras {
119*51ffecc1SBen Gras return wvline(stdscr, ch, count);
120*51ffecc1SBen Gras }
121*51ffecc1SBen Gras
122*51ffecc1SBen Gras /*
123*51ffecc1SBen Gras * mvvline --
124*51ffecc1SBen Gras * Move to the given location an draw a vertical line of character ch.
125*51ffecc1SBen Gras */
126*51ffecc1SBen Gras int
mvvline(int y,int x,chtype ch,int count)127*51ffecc1SBen Gras mvvline(int y, int x, chtype ch, int count)
128*51ffecc1SBen Gras {
129*51ffecc1SBen Gras return mvwvline(stdscr, y, x, ch, count);
130*51ffecc1SBen Gras }
131*51ffecc1SBen Gras
132*51ffecc1SBen Gras /*
133*51ffecc1SBen Gras * mvwvline --
134*51ffecc1SBen Gras * Move to the given location and draw a vertical line of character ch
135*51ffecc1SBen Gras * on the given window.
136*51ffecc1SBen Gras */
137*51ffecc1SBen Gras int
mvwvline(WINDOW * win,int y,int x,chtype ch,int count)138*51ffecc1SBen Gras mvwvline(WINDOW *win, int y, int x, chtype ch, int count)
139*51ffecc1SBen Gras {
140*51ffecc1SBen Gras if (wmove(win, y, x) == ERR)
141*51ffecc1SBen Gras return ERR;
142*51ffecc1SBen Gras
143*51ffecc1SBen Gras return wvline(win, ch, count);
144*51ffecc1SBen Gras }
145*51ffecc1SBen Gras
146*51ffecc1SBen Gras /*
147*51ffecc1SBen Gras * wvline --
148*51ffecc1SBen Gras * Draw a vertical line of character ch in the given window moving
149*51ffecc1SBen Gras * towards the bottom of the screen. At most count characters are drawn
150*51ffecc1SBen Gras * or until the edge of the screen, whichever comes first.
151*51ffecc1SBen Gras */
152*51ffecc1SBen Gras int
wvline(WINDOW * win,chtype ch,int count)153*51ffecc1SBen Gras wvline(WINDOW *win, chtype ch, int count)
154*51ffecc1SBen Gras {
155*51ffecc1SBen Gras #ifndef HAVE_WCHAR
156*51ffecc1SBen Gras int ocury, ocurx, n, i;
157*51ffecc1SBen Gras
158*51ffecc1SBen Gras n = min(count, win->maxy - win->cury);
159*51ffecc1SBen Gras ocury = win->cury;
160*51ffecc1SBen Gras ocurx = win->curx;
161*51ffecc1SBen Gras
162*51ffecc1SBen Gras if (!(ch & __CHARTEXT))
163*51ffecc1SBen Gras ch |= ACS_VLINE;
164*51ffecc1SBen Gras for (i = 0; i < n; i++)
165*51ffecc1SBen Gras mvwaddch(win, ocury + i, ocurx, ch);
166*51ffecc1SBen Gras
167*51ffecc1SBen Gras wmove(win, ocury, ocurx);
168*51ffecc1SBen Gras return OK;
169*51ffecc1SBen Gras #else
170*51ffecc1SBen Gras cchar_t cch, *cchp;
171*51ffecc1SBen Gras
172*51ffecc1SBen Gras if (ch & __CHARTEXT) {
173*51ffecc1SBen Gras __cursesi_chtype_to_cchar(ch, &cch);
174*51ffecc1SBen Gras cchp = & cch;
175*51ffecc1SBen Gras } else
176*51ffecc1SBen Gras cchp = WACS_VLINE;
177*51ffecc1SBen Gras
178*51ffecc1SBen Gras return wvline_set(win, cchp, count);
179*51ffecc1SBen Gras #endif
180*51ffecc1SBen Gras }
181*51ffecc1SBen Gras
hline_set(const cchar_t * wch,int n)182*51ffecc1SBen Gras int hline_set(const cchar_t *wch, int n)
183*51ffecc1SBen Gras {
184*51ffecc1SBen Gras #ifndef HAVE_WCHAR
185*51ffecc1SBen Gras return ERR;
186*51ffecc1SBen Gras #else
187*51ffecc1SBen Gras return whline_set( stdscr, wch, n );
188*51ffecc1SBen Gras #endif /* HAVE_WCHAR */
189*51ffecc1SBen Gras }
190*51ffecc1SBen Gras
mvhline_set(int y,int x,const cchar_t * wch,int n)191*51ffecc1SBen Gras int mvhline_set(int y, int x, const cchar_t *wch, int n)
192*51ffecc1SBen Gras {
193*51ffecc1SBen Gras #ifndef HAVE_WCHAR
194*51ffecc1SBen Gras return ERR;
195*51ffecc1SBen Gras #else
196*51ffecc1SBen Gras return mvwhline_set( stdscr, y, x, wch, n );
197*51ffecc1SBen Gras #endif /* HAVE_WCHAR */
198*51ffecc1SBen Gras }
199*51ffecc1SBen Gras
mvwhline_set(WINDOW * win,int y,int x,const cchar_t * wch,int n)200*51ffecc1SBen Gras int mvwhline_set(WINDOW *win, int y, int x, const cchar_t *wch, int n)
201*51ffecc1SBen Gras {
202*51ffecc1SBen Gras #ifndef HAVE_WCHAR
203*51ffecc1SBen Gras return ERR;
204*51ffecc1SBen Gras #else
205*51ffecc1SBen Gras if ( wmove( win, y , x ) == ERR )
206*51ffecc1SBen Gras return ERR;
207*51ffecc1SBen Gras
208*51ffecc1SBen Gras return whline_set( win, wch, n );
209*51ffecc1SBen Gras #endif /* HAVE_WCHAR */
210*51ffecc1SBen Gras }
211*51ffecc1SBen Gras
whline_set(WINDOW * win,const cchar_t * wch,int n)212*51ffecc1SBen Gras int whline_set(WINDOW *win, const cchar_t *wch, int n)
213*51ffecc1SBen Gras {
214*51ffecc1SBen Gras #ifndef HAVE_WCHAR
215*51ffecc1SBen Gras return ERR;
216*51ffecc1SBen Gras #else
217*51ffecc1SBen Gras int ocurx, wcn, i, cw;
218*51ffecc1SBen Gras cchar_t cc;
219*51ffecc1SBen Gras
220*51ffecc1SBen Gras cw = wcwidth( wch->vals[ 0 ]);
221*51ffecc1SBen Gras if (cw < 0)
222*51ffecc1SBen Gras cw = 1;
223*51ffecc1SBen Gras if ( ( win->maxx - win->curx ) < cw )
224*51ffecc1SBen Gras return ERR;
225*51ffecc1SBen Gras wcn = min( n, ( win->maxx - win->curx ) / cw );
226*51ffecc1SBen Gras #ifdef DEBUG
227*51ffecc1SBen Gras __CTRACE(__CTRACE_LINE, "whline_set: line of %d\n", wcn);
228*51ffecc1SBen Gras #endif /* DEBUG */
229*51ffecc1SBen Gras ocurx = win->curx;
230*51ffecc1SBen Gras
231*51ffecc1SBen Gras memcpy( &cc, wch, sizeof( cchar_t ));
232*51ffecc1SBen Gras if (!(wch->vals[ 0 ]))
233*51ffecc1SBen Gras cc.vals[ 0 ] |= WACS_HLINE->vals[0];
234*51ffecc1SBen Gras for (i = 0; i < wcn; i++ ) {
235*51ffecc1SBen Gras #ifdef DEBUG
236*51ffecc1SBen Gras __CTRACE(__CTRACE_LINE, "whline_set: (%d,%d)\n",
237*51ffecc1SBen Gras win->cury, ocurx + i * cw);
238*51ffecc1SBen Gras #endif /* DEBUG */
239*51ffecc1SBen Gras mvwadd_wch(win, win->cury, ocurx + i * cw, &cc);
240*51ffecc1SBen Gras }
241*51ffecc1SBen Gras
242*51ffecc1SBen Gras wmove(win, win->cury, ocurx);
243*51ffecc1SBen Gras return OK;
244*51ffecc1SBen Gras #endif /* HAVE_WCHAR */
245*51ffecc1SBen Gras }
246*51ffecc1SBen Gras
vline_set(const cchar_t * wch,int n)247*51ffecc1SBen Gras int vline_set(const cchar_t *wch, int n)
248*51ffecc1SBen Gras {
249*51ffecc1SBen Gras #ifndef HAVE_WCHAR
250*51ffecc1SBen Gras return ERR;
251*51ffecc1SBen Gras #else
252*51ffecc1SBen Gras return wvline_set( stdscr, wch, n );
253*51ffecc1SBen Gras #endif /* HAVE_WCHAR */
254*51ffecc1SBen Gras }
255*51ffecc1SBen Gras
mvvline_set(int y,int x,const cchar_t * wch,int n)256*51ffecc1SBen Gras int mvvline_set(int y, int x, const cchar_t *wch, int n)
257*51ffecc1SBen Gras {
258*51ffecc1SBen Gras #ifndef HAVE_WCHAR
259*51ffecc1SBen Gras return ERR;
260*51ffecc1SBen Gras #else
261*51ffecc1SBen Gras return mvwvline_set( stdscr, y, x, wch, n );
262*51ffecc1SBen Gras #endif /* HAVE_WCHAR */
263*51ffecc1SBen Gras }
264*51ffecc1SBen Gras
mvwvline_set(WINDOW * win,int y,int x,const cchar_t * wch,int n)265*51ffecc1SBen Gras int mvwvline_set(WINDOW *win, int y, int x, const cchar_t *wch, int n)
266*51ffecc1SBen Gras {
267*51ffecc1SBen Gras #ifndef HAVE_WCHAR
268*51ffecc1SBen Gras return ERR;
269*51ffecc1SBen Gras #else
270*51ffecc1SBen Gras if ( wmove( win, y, x ) == ERR )
271*51ffecc1SBen Gras return ERR;
272*51ffecc1SBen Gras
273*51ffecc1SBen Gras return wvline_set( win, wch, n );
274*51ffecc1SBen Gras #endif /* HAVE_WCHAR */
275*51ffecc1SBen Gras }
276*51ffecc1SBen Gras
wvline_set(WINDOW * win,const cchar_t * wch,int n)277*51ffecc1SBen Gras int wvline_set(WINDOW *win, const cchar_t *wch, int n)
278*51ffecc1SBen Gras {
279*51ffecc1SBen Gras #ifndef HAVE_WCHAR
280*51ffecc1SBen Gras return ERR;
281*51ffecc1SBen Gras #else
282*51ffecc1SBen Gras int ocury, ocurx, wcn, i;
283*51ffecc1SBen Gras cchar_t cc;
284*51ffecc1SBen Gras
285*51ffecc1SBen Gras wcn = min( n, win->maxy - win->cury);
286*51ffecc1SBen Gras #ifdef DEBUG
287*51ffecc1SBen Gras __CTRACE(__CTRACE_LINE, "wvline_set: line of %d\n", wcn);
288*51ffecc1SBen Gras #endif /* DEBUG */
289*51ffecc1SBen Gras ocury = win->cury;
290*51ffecc1SBen Gras ocurx = win->curx;
291*51ffecc1SBen Gras
292*51ffecc1SBen Gras memcpy( &cc, wch, sizeof( cchar_t ));
293*51ffecc1SBen Gras if (!(wch->vals[ 0 ]))
294*51ffecc1SBen Gras cc.vals[ 0 ] |= WACS_VLINE->vals[0];
295*51ffecc1SBen Gras for (i = 0; i < wcn; i++) {
296*51ffecc1SBen Gras mvwadd_wch(win, ocury + i, ocurx, &cc);
297*51ffecc1SBen Gras #ifdef DEBUG
298*51ffecc1SBen Gras __CTRACE(__CTRACE_LINE, "wvline_set: (%d,%d)\n",
299*51ffecc1SBen Gras ocury + i, ocurx);
300*51ffecc1SBen Gras #endif /* DEBUG */
301*51ffecc1SBen Gras }
302*51ffecc1SBen Gras wmove(win, ocury, ocurx);
303*51ffecc1SBen Gras return OK;
304*51ffecc1SBen Gras #endif /* HAVE_WCHAR */
305*51ffecc1SBen Gras }
306