xref: /freebsd/contrib/nvi/common/options_f.c (revision 40a8ac8f62b535d30349faf28cf47106b7041b83)
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[] = "$Id: options_f.c,v 10.34 04/07/11 16:06:29 zy Exp $";
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(
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(
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(
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(
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(
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_print __P((SCR *, OPTION *, char *, u_long *));
167  */
168 int
169 f_print(
170 	SCR *sp,
171 	OPTION *op,
172 	char *str,
173 	u_long *valp)
174 {
175 	int offset = op - sp->opts;
176 
177 	/* Preset the value, needed for reinitialization of lookup table. */
178 	if (offset == O_OCTAL) {
179 		if (*valp)
180 			O_SET(sp, offset);
181 		else
182 			O_CLR(sp, offset);
183 	} else if (o_set(sp, offset, OS_STRDUP, str, 0))
184 		return(1);
185 
186 	/* Reinitialize the key fast lookup table. */
187 	v_key_ilookup(sp);
188 
189 	/* Reformat the screen. */
190 	F_SET(sp, SC_SCR_REFORMAT);
191 	return (0);
192 }
193 
194 /*
195  * PUBLIC: int f_readonly __P((SCR *, OPTION *, char *, u_long *));
196  */
197 int
198 f_readonly(
199 	SCR *sp,
200 	OPTION *op,
201 	char *str,
202 	u_long *valp)
203 {
204 	/*
205 	 * !!!
206 	 * See the comment in exf.c.
207 	 */
208 	if (*valp)
209 		F_SET(sp, SC_READONLY);
210 	else
211 		F_CLR(sp, SC_READONLY);
212 	return (0);
213 }
214 
215 /*
216  * PUBLIC: int f_recompile __P((SCR *, OPTION *, char *, u_long *));
217  */
218 int
219 f_recompile(
220 	SCR *sp,
221 	OPTION *op,
222 	char *str,
223 	u_long *valp)
224 {
225 	if (F_ISSET(sp, SC_RE_SEARCH)) {
226 		regfree(&sp->re_c);
227 		F_CLR(sp, SC_RE_SEARCH);
228 	}
229 	if (F_ISSET(sp, SC_RE_SUBST)) {
230 		regfree(&sp->subre_c);
231 		F_CLR(sp, SC_RE_SUBST);
232 	}
233 	return (0);
234 }
235 
236 /*
237  * PUBLIC: int f_reformat __P((SCR *, OPTION *, char *, u_long *));
238  */
239 int
240 f_reformat(
241 	SCR *sp,
242 	OPTION *op,
243 	char *str,
244 	u_long *valp)
245 {
246 	F_SET(sp, SC_SCR_REFORMAT);
247 	return (0);
248 }
249 
250 /*
251  * PUBLIC: int f_ttywerase __P((SCR *, OPTION *, char *, u_long *));
252  */
253 int
254 f_ttywerase(
255 	SCR *sp,
256 	OPTION *op,
257 	char *str,
258 	u_long *valp)
259 {
260 	if (*valp)
261 		O_CLR(sp, O_ALTWERASE);
262 	return (0);
263 }
264 
265 /*
266  * PUBLIC: int f_w300 __P((SCR *, OPTION *, char *, u_long *));
267  */
268 int
269 f_w300(
270 	SCR *sp,
271 	OPTION *op,
272 	char *str,
273 	u_long *valp)
274 {
275 	u_long v;
276 
277 	/* Historical behavior for w300 was < 1200. */
278 	if (sp->gp->scr_baud(sp, &v))
279 		return (1);
280 	if (v >= 1200)
281 		return (0);
282 
283 	return (f_window(sp, op, str, valp));
284 }
285 
286 /*
287  * PUBLIC: int f_w1200 __P((SCR *, OPTION *, char *, u_long *));
288  */
289 int
290 f_w1200(
291 	SCR *sp,
292 	OPTION *op,
293 	char *str,
294 	u_long *valp)
295 {
296 	u_long v;
297 
298 	/* Historical behavior for w1200 was == 1200. */
299 	if (sp->gp->scr_baud(sp, &v))
300 		return (1);
301 	if (v < 1200 || v > 4800)
302 		return (0);
303 
304 	return (f_window(sp, op, str, valp));
305 }
306 
307 /*
308  * PUBLIC: int f_w9600 __P((SCR *, OPTION *, char *, u_long *));
309  */
310 int
311 f_w9600(
312 	SCR *sp,
313 	OPTION *op,
314 	char *str,
315 	u_long *valp)
316 {
317 	u_long v;
318 
319 	/* Historical behavior for w9600 was > 1200. */
320 	if (sp->gp->scr_baud(sp, &v))
321 		return (1);
322 	if (v <= 4800)
323 		return (0);
324 
325 	return (f_window(sp, op, str, valp));
326 }
327 
328 /*
329  * PUBLIC: int f_window __P((SCR *, OPTION *, char *, u_long *));
330  */
331 int
332 f_window(
333 	SCR *sp,
334 	OPTION *op,
335 	char *str,
336 	u_long *valp)
337 {
338 	if (*valp >= O_VAL(sp, O_LINES) - 1 &&
339 	    (*valp = O_VAL(sp, O_LINES) - 1) == 0)
340 		*valp = 1;
341 	return (0);
342 }
343 
344 /*
345  * PUBLIC: int f_encoding __P((SCR *, OPTION *, char *, u_long *));
346  */
347 int
348 f_encoding(
349 	SCR *sp,
350 	OPTION *op,
351 	char *str,
352 	u_long *valp)
353 {
354 	int offset = op - sp->opts;
355 
356 	return conv_enc(sp, offset, str);
357 }
358