1 /*        $NetBSD: erase.c,v 1.38 2024/12/23 02:58:03 blymn Exp $     */
2 
3 /*
4  * Copyright (c) 1981, 1993, 1994
5  *        The Regents of the University of California.  All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. Neither the name of the University nor the names of its contributors
16  *    may be used to endorse or promote products derived from this software
17  *    without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  */
31 
32 #include <sys/cdefs.h>
33 #ifndef lint
34 #if 0
35 static char sccsid[] = "@(#)erase.c     8.2 (Berkeley) 5/4/94";
36 #else
37 __RCSID("$NetBSD: erase.c,v 1.38 2024/12/23 02:58:03 blymn Exp $");
38 #endif
39 #endif                                  /* not lint */
40 
41 #include <stdlib.h>
42 
43 #include "curses.h"
44 #include "curses_private.h"
45 
46 #ifndef _CURSES_USE_MACROS
47 
48 /*
49  * erase --
50  *        Erases everything on stdscr.
51  */
52 int
erase(void)53 erase(void)
54 {
55           return werase(stdscr);
56 }
57 
58 #endif
59 
60 /*
61  * werase --
62  *        Erases everything on the window.
63  */
64 int
werase(WINDOW * win)65 werase(WINDOW *win)
66 {
67           int     y;
68           __LDATA *sp, *end, *start;
69           wchar_t   bch;
70           attr_t    battr;
71 
72           __CTRACE(__CTRACE_ERASE, "werase: (%p)\n", win);
73 
74           if (__predict_false(win == NULL))
75                     return ERR;
76 
77           bch = win->bch;
78           if (win != curscr)
79                     battr = win->battr & __ATTRIBUTES;
80           else
81                     battr = 0;
82 
83           for (y = 0; y < win->maxy; y++) {
84                     start = win->alines[y]->line;
85                     end = &start[win->maxx];
86                     for (sp = start; sp < end; sp++) {
87                               if (!(__NEED_ERASE(sp, bch, battr)))
88                                         continue;
89 
90                               sp->ch = bch;
91                               sp->cflags |= CA_BACKGROUND;
92                               sp->cflags &= ~CA_CONTINUATION;
93                               sp->attr = battr | (sp->attr & __ALTCHARSET);
94 #ifdef HAVE_WCHAR
95                               if (_cursesi_copy_nsp(win->bnsp, sp) == ERR)
96                                         return ERR;
97                               sp->wcols = 1;
98 #endif
99                     }
100           }
101 
102           /*
103            * Mark the whole window as changed in case we have overlapping
104            * windows - this will result in the (intended) clearing of the
105            * screen over the area covered by the window. */
106           __touchwin(win, 0);
107           wmove(win, 0, 0);
108           return OK;
109 }
110