xref: /minix3/lib/libcurses/line.c (revision 51ffecc181005cb45a40108612ee28d1daaeeb86)
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