1 /* Public Domain Curses */
2 
3 #include <curspriv.h>
4 
5 /*man-start**************************************************************
6 
7 deleteln
8 --------
9 
10 ### Synopsis
11 
12     int deleteln(void);
13     int wdeleteln(WINDOW *win);
14     int insdelln(int n);
15     int winsdelln(WINDOW *win, int n);
16     int insertln(void);
17     int winsertln(WINDOW *win);
18 
19     int mvdeleteln(int y, int x);
20     int mvwdeleteln(WINDOW *win, int y, int x);
21     int mvinsertln(int y, int x);
22     int mvwinsertln(WINDOW *win, int y, int x);
23 
24 ### Description
25 
26    With the deleteln() and wdeleteln() functions, the line under
27    the cursor in the window is deleted.  All lines below the
28    current line are moved up one line.  The bottom line of the
29    window is cleared.  The cursor position does not change.
30 
31    With the insertln() and winsertn() functions, a blank line is
32    inserted above the current line and the bottom line is lost.
33 
34    mvdeleteln(), mvwdeleteln(), mvinsertln() and mvwinsertln()
35    allow moving the cursor and inserting/deleting in one call.
36 
37 ### Return Value
38 
39    All functions return OK on success and ERR on error.
PDC_debug(const char * fmt,...)40 
41 ### Portability
42                              X/Open    BSD    SYS V
43     deleteln                    Y       Y       Y
44     wdeleteln                   Y       Y       Y
45     mvdeleteln                  -       -       -
46     mvwdeleteln                 -       -       -
47     insdelln                    Y       -      4.0
48     winsdelln                   Y       -      4.0
49     insertln                    Y       Y       Y
50     winsertln                   Y       Y       Y
51     mvinsertln                  -       -       -
52     mvwinsertln                 -       -       -
53 
54 **man-end****************************************************************/
55 
56 int wdeleteln(WINDOW *win)
57 {
58     chtype blank, *temp, *ptr;
59     int y;
60 
61     PDC_LOG(("wdeleteln() - called\n"));
62 
63     if (!win)
64         return ERR;
65 
66     /* wrs (4/10/93) account for window background */
67 
68     blank = win->_bkgd;
69 
70     temp = win->_y[win->_cury];
71 
72     for (y = win->_cury; y < win->_bmarg; y++)
73     {
74         win->_y[y] = win->_y[y + 1];
75         win->_firstch[y] = 0;
76         win->_lastch[y] = win->_maxx - 1;
77     }
78 
79     for (ptr = temp; (ptr - temp < win->_maxx); ptr++)
80         *ptr = blank;           /* make a blank line */
81 
82     if (win->_cury <= win->_bmarg)
83     {
84         win->_firstch[win->_bmarg] = 0;
85         win->_lastch[win->_bmarg] = win->_maxx - 1;
86         win->_y[win->_bmarg] = temp;
87     }
88 
89     return OK;
90 }
91 
92 int deleteln(void)
93 {
94     PDC_LOG(("deleteln() - called\n"));
95 
96     return wdeleteln(stdscr);
97 }
98 
99 int mvdeleteln(int y, int x)
100 {
101     PDC_LOG(("mvdeleteln() - called\n"));
102 
103     if (move(y, x) == ERR)
104         return ERR;
105 
106     return wdeleteln(stdscr);
107 }
108 
109 int mvwdeleteln(WINDOW *win, int y, int x)
110 {
111     PDC_LOG(("mvwdeleteln() - called\n"));
112 
113     if (wmove(win, y, x) == ERR)
114         return ERR;
115 
116     return wdeleteln(win);
117 }
118 
119 int winsdelln(WINDOW *win, int n)
120 {
121     int i;
122 
123     PDC_LOG(("winsdelln() - called\n"));
124 
125     if (!win)
126         return ERR;
127 
128     if (n > 0)
129     {
130         for (i = 0; i < n; i++)
131             if (winsertln(win) == ERR)
132                 return ERR;
133     }
134     else if (n < 0)
135     {
136         n = -n;
137         for (i = 0; i < n; i++)
138             if (wdeleteln(win) == ERR)
139                 return ERR;
140     }
141 
142     return OK;
143 }
144 
145 int insdelln(int n)
146 {
147     PDC_LOG(("insdelln() - called\n"));
148 
149     return winsdelln(stdscr, n);
150 }
151 
152 int winsertln(WINDOW *win)
153 {
154     chtype blank, *temp, *end;
155     int y;
156 
157     PDC_LOG(("winsertln() - called\n"));
158 
159     if (!win)
160         return ERR;
161 
162     /* wrs (4/10/93) account for window background */
163 
164     blank = win->_bkgd;
165 
166     temp = win->_y[win->_maxy - 1];
167 
168     for (y = win->_maxy - 1; y > win->_cury; y--)
169     {
170         win->_y[y] = win->_y[y - 1];
171         win->_firstch[y] = 0;
172         win->_lastch[y] = win->_maxx - 1;
173     }
174 
175     win->_y[win->_cury] = temp;
176 
177     for (end = &temp[win->_maxx - 1]; temp <= end; temp++)
178         *temp = blank;
179 
180     win->_firstch[win->_cury] = 0;
181     win->_lastch[win->_cury] = win->_maxx - 1;
182 
183     return OK;
184 }
185 
186 int insertln(void)
187 {
188     PDC_LOG(("insertln() - called\n"));
189 
190     return winsertln(stdscr);
191 }
192 
193 int mvinsertln(int y, int x)
194 {
195     PDC_LOG(("mvinsertln() - called\n"));
196 
197     if (move(y, x) == ERR)
198         return ERR;
199 
200     return winsertln(stdscr);
201 }
202 
203 int mvwinsertln(WINDOW *win, int y, int x)
204 {
205     PDC_LOG(("mvwinsertln() - called\n"));
206 
207     if (wmove(win, y, x) == ERR)
208         return ERR;
209 
210     return winsertln(win);
211 }
212