1 1.24 blymn /* $NetBSD: insdelln.c,v 1.24 2024/12/23 02:58:03 blymn Exp $ */ 2 1.2 blymn 3 1.2 blymn /* 4 1.2 blymn * Copyright (c) 2000 The NetBSD Foundation, Inc. 5 1.2 blymn * All rights reserved. 6 1.2 blymn * 7 1.2 blymn * This code is derived from software contributed to The NetBSD Foundation 8 1.2 blymn * by Julian Coleman. 9 1.2 blymn * 10 1.2 blymn * Redistribution and use in source and binary forms, with or without 11 1.2 blymn * modification, are permitted provided that the following conditions 12 1.2 blymn * are met: 13 1.2 blymn * 1. Redistributions of source code must retain the above copyright 14 1.2 blymn * notice, this list of conditions and the following disclaimer. 15 1.2 blymn * 2. Redistributions in binary form must reproduce the above copyright 16 1.2 blymn * notice, this list of conditions and the following disclaimer in the 17 1.2 blymn * documentation and/or other materials provided with the distribution. 18 1.2 blymn * 19 1.2 blymn * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.2 blymn * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.2 blymn * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.2 blymn * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.2 blymn * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.2 blymn * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.2 blymn * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.2 blymn * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.2 blymn * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.2 blymn * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.2 blymn * POSSIBILITY OF SUCH DAMAGE. 30 1.2 blymn */ 31 1.6 blymn 32 1.6 blymn #include <sys/cdefs.h> 33 1.6 blymn #ifndef lint 34 1.24 blymn __RCSID("$NetBSD: insdelln.c,v 1.24 2024/12/23 02:58:03 blymn Exp $"); 35 1.6 blymn #endif /* not lint */ 36 1.2 blymn 37 1.14 blymn /* 38 1.2 blymn * Based on deleteln.c and insertln.c - 39 1.2 blymn * Copyright (c) 1981, 1993, 1994 40 1.2 blymn * The Regents of the University of California. All rights reserved. 41 1.2 blymn */ 42 1.2 blymn 43 1.2 blymn #include <string.h> 44 1.14 blymn #include <stdlib.h> 45 1.2 blymn 46 1.2 blymn #include "curses.h" 47 1.2 blymn #include "curses_private.h" 48 1.2 blymn 49 1.3 blymn #ifndef _CURSES_USE_MACROS 50 1.3 blymn 51 1.3 blymn /* 52 1.3 blymn * insdelln -- 53 1.3 blymn * Insert or delete lines on stdscr, leaving (cury, curx) unchanged. 54 1.3 blymn */ 55 1.3 blymn int 56 1.16 roy insdelln(int nlines) 57 1.3 blymn { 58 1.18 roy 59 1.16 roy return winsdelln(stdscr, nlines); 60 1.3 blymn } 61 1.3 blymn 62 1.3 blymn #endif 63 1.3 blymn 64 1.2 blymn /* 65 1.2 blymn * winsdelln -- 66 1.2 blymn * Insert or delete lines on the window, leaving (cury, curx) unchanged. 67 1.2 blymn */ 68 1.2 blymn int 69 1.16 roy winsdelln(WINDOW *win, int nlines) 70 1.2 blymn { 71 1.8 jdc int y, i, last; 72 1.2 blymn __LINE *temp; 73 1.14 blymn #ifdef HAVE_WCHAR 74 1.14 blymn __LDATA *lp; 75 1.14 blymn #endif /* HAVE_WCHAR */ 76 1.12 jdc attr_t attr; 77 1.2 blymn 78 1.13 jdc __CTRACE(__CTRACE_LINE, 79 1.16 roy "winsdelln: (%p) cury=%d lines=%d\n", win, win->cury, nlines); 80 1.2 blymn 81 1.24 blymn if (__predict_false(win == NULL)) 82 1.24 blymn return ERR; 83 1.24 blymn 84 1.16 roy if (!nlines) 85 1.18 roy return OK; 86 1.2 blymn 87 1.12 jdc if (__using_color && win != curscr) 88 1.12 jdc attr = win->battr & __COLOR; 89 1.12 jdc else 90 1.12 jdc attr = 0; 91 1.12 jdc 92 1.16 roy if (nlines > 0) { 93 1.2 blymn /* Insert lines */ 94 1.8 jdc if (win->cury < win->scr_t || win->cury > win->scr_b) { 95 1.8 jdc /* Outside scrolling region */ 96 1.16 roy if (nlines > win->maxy - win->cury) 97 1.16 roy nlines = win->maxy - win->cury; 98 1.8 jdc last = win->maxy - 1; 99 1.8 jdc } else { 100 1.8 jdc /* Inside scrolling region */ 101 1.16 roy if (nlines > win->scr_b + 1 - win->cury) 102 1.16 roy nlines = win->scr_b + 1 - win->cury; 103 1.8 jdc last = win->scr_b; 104 1.8 jdc } 105 1.16 roy for (y = last - nlines; y >= win->cury; --y) { 106 1.16 roy win->alines[y]->flags &= ~__ISPASTEOL; 107 1.16 roy win->alines[y + nlines]->flags &= ~__ISPASTEOL; 108 1.2 blymn if (win->orig == NULL) { 109 1.16 roy temp = win->alines[y + nlines]; 110 1.16 roy win->alines[y + nlines] = win->alines[y]; 111 1.16 roy win->alines[y] = temp; 112 1.2 blymn } else { 113 1.18 roy (void)memcpy(win->alines[y + nlines]->line, 114 1.16 roy win->alines[y]->line, 115 1.18 roy (size_t)win->maxx * __LDATASIZE); 116 1.2 blymn } 117 1.2 blymn } 118 1.16 roy for (y = win->cury - 1 + nlines; y >= win->cury; --y) 119 1.2 blymn for (i = 0; i < win->maxx; i++) { 120 1.16 roy win->alines[y]->line[i].ch = win->bch; 121 1.16 roy win->alines[y]->line[i].attr = attr; 122 1.23 blymn win->alines[y]->line[i].cflags |= 123 1.23 blymn CA_BACKGROUND; 124 1.23 blymn win->alines[y]->line[i].cflags &= 125 1.23 blymn ~CA_CONTINUATION; 126 1.21 blymn #ifdef HAVE_WCHAR 127 1.16 roy lp = &win->alines[y]->line[i]; 128 1.14 blymn if (_cursesi_copy_nsp(win->bnsp, lp) == ERR) 129 1.14 blymn return ERR; 130 1.20 blymn lp->wcols = 1; 131 1.14 blymn #endif /* HAVE_WCHAR */ 132 1.2 blymn } 133 1.8 jdc for (y = last; y >= win->cury; --y) 134 1.18 roy __touchline(win, y, 0, (int)win->maxx - 1); 135 1.2 blymn } else { 136 1.16 roy /* Delete nlines */ 137 1.16 roy nlines = 0 - nlines; 138 1.8 jdc if (win->cury < win->scr_t || win->cury > win->scr_b) { 139 1.8 jdc /* Outside scrolling region */ 140 1.16 roy if (nlines > win->maxy - win->cury) 141 1.16 roy nlines = win->maxy - win->cury; 142 1.8 jdc last = win->maxy; 143 1.8 jdc } else { 144 1.8 jdc /* Inside scrolling region */ 145 1.16 roy if (nlines > win->scr_b + 1 - win->cury) 146 1.16 roy nlines = win->scr_b + 1 - win->cury; 147 1.8 jdc last = win->scr_b + 1; 148 1.8 jdc } 149 1.16 roy for (y = win->cury; y < last - nlines; y++) { 150 1.16 roy win->alines[y]->flags &= ~__ISPASTEOL; 151 1.16 roy win->alines[y + nlines]->flags &= ~__ISPASTEOL; 152 1.2 blymn if (win->orig == NULL) { 153 1.16 roy temp = win->alines[y]; 154 1.16 roy win->alines[y] = win->alines[y + nlines]; 155 1.16 roy win->alines[y + nlines] = temp; 156 1.2 blymn } else { 157 1.18 roy (void)memcpy(win->alines[y]->line, 158 1.16 roy win->alines[y + nlines]->line, 159 1.18 roy (size_t)win->maxx * __LDATASIZE); 160 1.2 blymn } 161 1.2 blymn } 162 1.16 roy for (y = last - nlines; y < last; y++) 163 1.2 blymn for (i = 0; i < win->maxx; i++) { 164 1.16 roy win->alines[y]->line[i].ch = win->bch; 165 1.16 roy win->alines[y]->line[i].attr = attr; 166 1.23 blymn win->alines[y]->line[i].cflags |= 167 1.23 blymn CA_BACKGROUND; 168 1.23 blymn win->alines[y]->line[i].cflags &= 169 1.23 blymn ~CA_CONTINUATION; 170 1.22 blymn #ifdef HAVE_WCHAR 171 1.16 roy lp = &win->alines[y]->line[i]; 172 1.20 blymn lp->wcols = 1; 173 1.14 blymn if (_cursesi_copy_nsp(win->bnsp, lp) == ERR) 174 1.14 blymn return ERR; 175 1.14 blymn #endif /* HAVE_WCHAR */ 176 1.2 blymn } 177 1.8 jdc for (y = win->cury; y < last; y++) 178 1.18 roy __touchline(win, y, 0, (int)win->maxx - 1); 179 1.2 blymn } 180 1.2 blymn if (win->orig != NULL) 181 1.4 mycroft __id_subwins(win->orig); 182 1.17 roy __sync(win); 183 1.18 roy return OK; 184 1.2 blymn } 185