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