1 /* $OpenBSD: options_f.c,v 1.13 2019/05/21 09:24:58 martijn Exp $ */
2
3 /*-
4 * Copyright (c) 1993, 1994
5 * The Regents of the University of California. All rights reserved.
6 * Copyright (c) 1993, 1994, 1995, 1996
7 * Keith Bostic. All rights reserved.
8 *
9 * See the LICENSE file for redistribution information.
10 */
11
12 #include "config.h"
13
14 #include <sys/types.h>
15 #include <sys/queue.h>
16 #include <sys/stat.h>
17
18 #include <bitstring.h>
19 #include <ctype.h>
20 #include <errno.h>
21 #include <limits.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <unistd.h>
26
27 #include "common.h"
28
29 /*
30 * PUBLIC: int f_altwerase(SCR *, OPTION *, char *, u_long *);
31 */
32 int
f_altwerase(SCR * sp,OPTION * op,char * str,u_long * valp)33 f_altwerase(SCR *sp, OPTION *op, char *str, u_long *valp)
34 {
35 if (!*valp)
36 O_CLR(sp, O_TTYWERASE);
37 return (0);
38 }
39
40 /*
41 * PUBLIC: int f_columns(SCR *, OPTION *, char *, u_long *);
42 */
43 int
f_columns(SCR * sp,OPTION * op,char * str,u_long * valp)44 f_columns(SCR *sp, OPTION *op, char *str, u_long *valp)
45 {
46 /* Validate the number. */
47 if (*valp < MINIMUM_SCREEN_COLS) {
48 msgq(sp, M_ERR, "Screen columns too small, less than %d",
49 MINIMUM_SCREEN_COLS);
50 return (1);
51 }
52
53 /*
54 * !!!
55 * It's not uncommon for allocation of huge chunks of memory to cause
56 * core dumps on various systems. So, we prune out numbers that are
57 * "obviously" wrong. Vi will not work correctly if it has the wrong
58 * number of lines/columns for the screen, but at least we don't drop
59 * core.
60 */
61 #define MAXIMUM_SCREEN_COLS 768
62 if (*valp > MAXIMUM_SCREEN_COLS) {
63 msgq(sp, M_ERR, "Screen columns too large, greater than %d",
64 MAXIMUM_SCREEN_COLS);
65 return (1);
66 }
67 return (0);
68 }
69
70 /*
71 * PUBLIC: int f_lines(SCR *, OPTION *, char *, u_long *);
72 */
73 int
f_lines(SCR * sp,OPTION * op,char * str,u_long * valp)74 f_lines(SCR *sp, OPTION *op, char *str, u_long *valp)
75 {
76 /* Validate the number. */
77 if (*valp < MINIMUM_SCREEN_ROWS) {
78 msgq(sp, M_ERR, "Screen lines too small, less than %d",
79 MINIMUM_SCREEN_ROWS);
80 return (1);
81 }
82
83 /*
84 * !!!
85 * It's not uncommon for allocation of huge chunks of memory to cause
86 * core dumps on various systems. So, we prune out numbers that are
87 * "obviously" wrong. Vi will not work correctly if it has the wrong
88 * number of lines/columns for the screen, but at least we don't drop
89 * core.
90 */
91 #define MAXIMUM_SCREEN_ROWS 500
92 if (*valp > MAXIMUM_SCREEN_ROWS) {
93 msgq(sp, M_ERR, "Screen lines too large, greater than %d",
94 MAXIMUM_SCREEN_ROWS);
95 return (1);
96 }
97
98 /*
99 * Set the value, and the related scroll value. If no window
100 * value set, set a new default window.
101 */
102 o_set(sp, O_LINES, 0, NULL, *valp);
103 if (*valp == 1) {
104 sp->defscroll = 1;
105
106 if (O_VAL(sp, O_WINDOW) == O_D_VAL(sp, O_WINDOW) ||
107 O_VAL(sp, O_WINDOW) > *valp) {
108 o_set(sp, O_WINDOW, 0, NULL, 1);
109 o_set(sp, O_WINDOW, OS_DEF, NULL, 1);
110 }
111 } else {
112 sp->defscroll = (*valp - 1) / 2;
113
114 if (O_VAL(sp, O_WINDOW) == O_D_VAL(sp, O_WINDOW) ||
115 O_VAL(sp, O_WINDOW) > *valp) {
116 o_set(sp, O_WINDOW, 0, NULL, *valp - 1);
117 o_set(sp, O_WINDOW, OS_DEF, NULL, *valp - 1);
118 }
119 }
120 return (0);
121 }
122
123 /*
124 * PUBLIC: int f_paragraph(SCR *, OPTION *, char *, u_long *);
125 */
126 int
f_paragraph(SCR * sp,OPTION * op,char * str,u_long * valp)127 f_paragraph(SCR *sp, OPTION *op, char *str, u_long *valp)
128 {
129 if (strlen(str) & 1) {
130 msgq(sp, M_ERR,
131 "The paragraph option must be in two character groups");
132 return (1);
133 }
134 return (0);
135 }
136
137 /*
138 * PUBLIC: int f_print(SCR *, OPTION *, char *, u_long *);
139 */
140 int
f_print(SCR * sp,OPTION * op,char * str,u_long * valp)141 f_print(SCR *sp, OPTION *op, char *str, u_long *valp)
142 {
143 /* Reinitialize the key fast lookup table. */
144 v_key_ilookup(sp);
145
146 /* Reformat the screen. */
147 F_SET(sp, SC_SCR_REFORMAT);
148 return (0);
149 }
150
151 /*
152 * PUBLIC: int f_readonly(SCR *, OPTION *, char *, u_long *);
153 */
154 int
f_readonly(SCR * sp,OPTION * op,char * str,u_long * valp)155 f_readonly(SCR *sp, OPTION *op, char *str, u_long *valp)
156 {
157 /*
158 * !!!
159 * See the comment in exf.c.
160 */
161 if (*valp)
162 F_CLR(sp, SC_READONLY);
163 else
164 F_SET(sp, SC_READONLY);
165 return (0);
166 }
167
168 /*
169 * PUBLIC: int f_recompile(SCR *, OPTION *, char *, u_long *);
170 */
171 int
f_recompile(SCR * sp,OPTION * op,char * str,u_long * valp)172 f_recompile(SCR *sp, OPTION *op, char *str, u_long *valp)
173 {
174 if (F_ISSET(sp, SC_RE_SEARCH)) {
175 regfree(&sp->re_c);
176 F_CLR(sp, SC_RE_SEARCH);
177 }
178 if (F_ISSET(sp, SC_RE_SUBST)) {
179 regfree(&sp->subre_c);
180 F_CLR(sp, SC_RE_SUBST);
181 }
182 return (0);
183 }
184
185 /*
186 * PUBLIC: int f_reformat(SCR *, OPTION *, char *, u_long *);
187 */
188 int
f_reformat(SCR * sp,OPTION * op,char * str,u_long * valp)189 f_reformat(SCR *sp, OPTION *op, char *str, u_long *valp)
190 {
191 F_SET(sp, SC_SCR_REFORMAT);
192 return (0);
193 }
194
195 /*
196 * PUBLIC: int f_section(SCR *, OPTION *, char *, u_long *);
197 */
198 int
f_section(SCR * sp,OPTION * op,char * str,u_long * valp)199 f_section(SCR *sp, OPTION *op, char *str, u_long *valp)
200 {
201 if (strlen(str) & 1) {
202 msgq(sp, M_ERR,
203 "The section option must be in two character groups");
204 return (1);
205 }
206 return (0);
207 }
208
209 /*
210 * PUBLIC: int f_secure(SCR *, OPTION *, char *, u_long *)
211 */
212 int
f_secure(SCR * sp,OPTION * op,char * str,u_long * valp)213 f_secure(SCR *sp, OPTION *op, char *str, u_long *valp)
214 {
215 if (pledge("stdio rpath wpath cpath fattr flock getpw tty", NULL) == -1) {
216 msgq(sp, M_ERR, "pledge failed");
217 return (1);
218 }
219 return (0);
220 }
221
222 /*
223 * PUBLIC: int f_ttywerase(SCR *, OPTION *, char *, u_long *);
224 */
225 int
f_ttywerase(SCR * sp,OPTION * op,char * str,u_long * valp)226 f_ttywerase(SCR *sp, OPTION *op, char *str, u_long *valp)
227 {
228 if (!*valp)
229 O_CLR(sp, O_ALTWERASE);
230 return (0);
231 }
232
233 /*
234 * PUBLIC: int f_w300(SCR *, OPTION *, char *, u_long *);
235 */
236 int
f_w300(SCR * sp,OPTION * op,char * str,u_long * valp)237 f_w300(SCR *sp, OPTION *op, char *str, u_long *valp)
238 {
239 u_long v;
240
241 /* Historical behavior for w300 was < 1200. */
242 if (sp->gp->scr_baud(sp, &v))
243 return (1);
244 if (v >= 1200)
245 return (0);
246
247 return (f_window(sp, op, str, valp));
248 }
249
250 /*
251 * PUBLIC: int f_w1200(SCR *, OPTION *, char *, u_long *);
252 */
253 int
f_w1200(SCR * sp,OPTION * op,char * str,u_long * valp)254 f_w1200(SCR *sp, OPTION *op, char *str, u_long *valp)
255 {
256 u_long v;
257
258 /* Historical behavior for w1200 was == 1200. */
259 if (sp->gp->scr_baud(sp, &v))
260 return (1);
261 if (v < 1200 || v > 4800)
262 return (0);
263
264 return (f_window(sp, op, str, valp));
265 }
266
267 /*
268 * PUBLIC: int f_w9600(SCR *, OPTION *, char *, u_long *);
269 */
270 int
f_w9600(SCR * sp,OPTION * op,char * str,u_long * valp)271 f_w9600(SCR *sp, OPTION *op, char *str, u_long *valp)
272 {
273 u_long v;
274
275 /* Historical behavior for w9600 was > 1200. */
276 if (sp->gp->scr_baud(sp, &v))
277 return (1);
278 if (v <= 4800)
279 return (0);
280
281 return (f_window(sp, op, str, valp));
282 }
283
284 /*
285 * PUBLIC: int f_window(SCR *, OPTION *, char *, u_long *);
286 */
287 int
f_window(SCR * sp,OPTION * op,char * str,u_long * valp)288 f_window(SCR *sp, OPTION *op, char *str, u_long *valp)
289 {
290 if (*valp >= O_VAL(sp, O_LINES) - 1 &&
291 (*valp = O_VAL(sp, O_LINES) - 1) == 0)
292 *valp = 1;
293 return (0);
294 }
295