source: trunk/third/nvi/common/options_f.c @ 14302

Revision 14302, 6.6 KB checked in by ghudson, 25 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r14301, which included commits to RCS files with non-trunk default branches.
Line 
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
13static 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 */
34int
35f_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 */
49int
50f_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 */
83int
84f_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 */
140int
141f_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 */
154int
155f_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 */
168int
169f_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 */
186int
187f_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 */
204int
205f_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 */
225int
226f_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 */
246int
247f_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 */
260int
261f_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 */
278int
279f_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 */
293int
294f_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 */
314int
315f_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 */
335int
336f_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 */
356int
357f_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}
Note: See TracBrowser for help on using the repository browser.