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