xref: /openbsd/usr.bin/vi/common/options_f.c (revision 64220a0b)
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