⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 options.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
/*- * Copyright (c) 1991, 1993, 1994 *	The Regents of the University of California.  All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software *    must display the following acknowledgement: *	This product includes software developed by the University of *	California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */#ifndef lintstatic char sccsid[] = "@(#)options.c	8.54 (Berkeley) 4/9/94";#endif /* not lint */#include <sys/types.h>#include <sys/queue.h>#include <sys/stat.h>#include <sys/time.h>#include <bitstring.h>#include <ctype.h>#include <errno.h>#include <limits.h>#include <signal.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <termios.h>#include <unistd.h>#include "compat.h"#include <db.h>#include <regex.h>#include <pathnames.h>#include "vi.h"#include "excmd.h"static int	 	 opts_abbcmp __P((const void *, const void *));static int	 	 opts_cmp __P((const void *, const void *));static OPTLIST const	*opts_prefix __P((char *));static int	 	 opts_print __P((SCR *, OPTLIST const *));/* * O'Reilly noted options and abbreviations are from "Learning the VI Editor", * Fifth Edition, May 1992.  There's no way of knowing what systems they are * actually from. * * HPUX noted options and abbreviations are from "The Ultimate Guide to the * VI and EX Text Editors", 1990. */static OPTLIST const optlist[] = {/* O_ALTWERASE	  4.4BSD */	{"altwerase",	f_altwerase,	OPT_0BOOL,	0},/* O_AUTOINDENT	    4BSD */	{"autoindent",	NULL,		OPT_0BOOL,	0},/* O_AUTOPRINT	    4BSD */	{"autoprint",	NULL,		OPT_1BOOL,	0},/* O_AUTOWRITE	    4BSD */	{"autowrite",	NULL,		OPT_0BOOL,	0},/* O_BEAUTIFY	    4BSD */	{"beautify",	NULL,		OPT_0BOOL,	0},/* O_CDPATH	  4.4BSD */	{"cdpath",	f_cdpath,	OPT_STR,	0},/* O_COLUMNS	  4.4BSD */	{"columns",	f_columns,	OPT_NUM,	OPT_NOSAVE},/* O_COMMENT	  4.4BSD */	{"comment",	NULL,		OPT_0BOOL,	0},/* O_DIGRAPH	  XXX: Elvis */	{"digraph",	NULL,		OPT_0BOOL,	0},/* O_DIRECTORY	    4BSD */	{"directory",	NULL,		OPT_STR,	0},/* O_EDCOMPATIBLE   4BSD */	{"edcompatible",NULL,		OPT_0BOOL,	0},/* O_ERRORBELLS	    4BSD */	{"errorbells",	NULL,		OPT_0BOOL,	0},/* O_EXRC	System V (undocumented) */	{"exrc",	NULL,		OPT_0BOOL,	0},/* O_EXTENDED	  4.4BSD */	{"extended",	NULL,		OPT_0BOOL,	0},/* O_FLASH	    HPUX */	{"flash",	NULL,		OPT_1BOOL,	0},/* O_HARDTABS	    4BSD */	{"hardtabs",	NULL,		OPT_NUM,	0},/* O_IGNORECASE	    4BSD */	{"ignorecase",	NULL,		OPT_0BOOL,	0},/* O_KEYTIME	  4.4BSD */	{"keytime",	f_keytime,	OPT_NUM,	0},/* O_LEFTRIGHT	  4.4BSD */	{"leftright",	f_leftright,	OPT_0BOOL,	0},/* O_LINES	  4.4BSD */	{"lines",	f_lines,	OPT_NUM,	OPT_NOSAVE},/* O_LISP	    4BSD *//* * XXX * When the lisp option is implemented, delete * the OPT_NOSAVE flag, so that :mkexrc dumps it. */	{"lisp",	f_lisp,		OPT_0BOOL,	OPT_NOSAVE},/* O_LIST	    4BSD */	{"list",	f_list,		OPT_0BOOL,	0},/* O_MAGIC	    4BSD */	{"magic",	NULL,		OPT_1BOOL,	0},/* O_MATCHTIME	  4.4BSD */	{"matchtime",	f_matchtime,	OPT_NUM,	0},/* O_MESG	    4BSD */	{"mesg",	f_mesg,		OPT_1BOOL,	0},/* O_MODELINE	    4BSD */	{"modeline",	f_modeline,	OPT_0BOOL,	0},/* O_NUMBER	    4BSD */	{"number",	f_number,	OPT_0BOOL,	0},/* O_OCTAL	  4.4BSD */	{"octal",	f_octal,	OPT_0BOOL,	0},/* O_OPEN	    4BSD */	{"open",	NULL,		OPT_1BOOL,	0},/* O_OPTIMIZE	    4BSD */	{"optimize",	NULL,		OPT_1BOOL,	0},/* O_PARAGRAPHS	    4BSD */	{"paragraphs",	f_paragraph,	OPT_STR,	0},/* O_PROMPT	    4BSD */	{"prompt",	NULL,		OPT_1BOOL,	0},/* O_READONLY	    4BSD (undocumented) */	{"readonly",	f_readonly,	OPT_0BOOL,	0},/* O_RECDIR	  4.4BSD */	{"recdir",	NULL,		OPT_STR,	0},/* O_REDRAW	    4BSD */	{"redraw",	NULL,		OPT_0BOOL,	0},/* O_REMAP	    4BSD */	{"remap",	NULL,		OPT_1BOOL,	0},/* O_REMAPMAX	  4.4BSD */	{"remapmax",	NULL,		OPT_1BOOL,	0},/* O_REPORT	    4BSD */	{"report",	NULL,		OPT_NUM,	OPT_NOSTR},/* O_RULER	  4.4BSD */	{"ruler",	f_ruler,	OPT_0BOOL,	0},/* O_SCROLL	    4BSD */	{"scroll",	NULL,		OPT_NUM,	0},/* O_SECTIONS	    4BSD */	{"sections",	f_section,	OPT_STR,	0},/* O_SHELL	    4BSD */	{"shell",	NULL,		OPT_STR,	0},/* O_SHIFTWIDTH	    4BSD */	{"shiftwidth",	f_shiftwidth,	OPT_NUM,	0},/* O_SHOWDIRTY	  4.4BSD */	{"showdirty",	NULL,		OPT_0BOOL,	0},/* O_SHOWMATCH	    4BSD */	{"showmatch",	NULL,		OPT_0BOOL,	0},/* O_SHOWMODE	  4.4BSD */	{"showmode",	NULL,		OPT_0BOOL,	0},/* O_SIDESCROLL	  4.4BSD */	{"sidescroll",	f_sidescroll,	OPT_NUM,	0},/* O_SLOWOPEN	    4BSD  */	{"slowopen",	NULL,		OPT_0BOOL,	0},/* O_SOURCEANY	    4BSD (undocumented) */	{"sourceany",	f_sourceany,	OPT_0BOOL,	0},/* O_TABSTOP	    4BSD */	{"tabstop",	f_tabstop,	OPT_NUM,	0},/* O_TAGLENGTH	    4BSD */	{"taglength",	NULL,		OPT_NUM,	OPT_NOSTR},/* O_TAGS	    4BSD */	{"tags",	f_tags,		OPT_STR,	0},/* O_TERM	    4BSD */	{"term",	f_term,		OPT_STR,	OPT_NOSAVE},/* O_TERSE	    4BSD */	{"terse",	NULL,		OPT_0BOOL,	0},/* O_TIMEOUT	    4BSD (undocumented) */	{"timeout",	NULL,		OPT_1BOOL,	0},/* O_TTYWERASE	  4.4BSD */	{"ttywerase",	f_ttywerase,	OPT_0BOOL,	0},/* O_VERBOSE	  4.4BSD */	{"verbose",	NULL,		OPT_0BOOL,	0},/* O_W1200	    4BSD */	{"w1200",	f_w1200,	OPT_NUM,	OPT_NEVER|OPT_NOSAVE},/* O_W300	    4BSD */	{"w300",	f_w300,		OPT_NUM,	OPT_NEVER|OPT_NOSAVE},/* O_W9600	    4BSD */	{"w9600",	f_w9600,	OPT_NUM,	OPT_NEVER|OPT_NOSAVE},/* O_WARN	    4BSD */	{"warn",	NULL,		OPT_1BOOL,	0},/* O_WINDOW	    4BSD */	{"window",	f_window,	OPT_NUM,	0},/* O_WRAPMARGIN	    4BSD */	{"wrapmargin",	f_wrapmargin,	OPT_NUM,	OPT_NOSTR},/* O_WRAPSCAN	    4BSD */	{"wrapscan",	NULL,		OPT_1BOOL,	0},/* O_WRITEANY	    4BSD */	{"writeany",	NULL,		OPT_0BOOL,	0},	{NULL},};typedef struct abbrev {        char *name;        int offset;} OABBREV;static OABBREV const abbrev[] = {	{"ai",		O_AUTOINDENT},		/*     4BSD */	{"ap",		O_AUTOPRINT},		/*     4BSD */	{"aw",		O_AUTOWRITE},		/*     4BSD */	{"bf",		O_BEAUTIFY},		/*     4BSD */	{"co",		O_COLUMNS},		/*   4.4BSD */	{"dir",		O_DIRECTORY},		/*     4BSD */	{"eb",		O_ERRORBELLS},		/*     4BSD */	{"ed",		O_EDCOMPATIBLE},	/*     4BSD */	{"ex",		O_EXRC},		/* System V (undocumented) */	{"ht",		O_HARDTABS},		/*     4BSD */	{"ic",		O_IGNORECASE},		/*     4BSD */	{"li",		O_LINES},		/*   4.4BSD */	{"modelines",	O_MODELINE},		/*     HPUX */	{"nu",		O_NUMBER},		/*     4BSD */	{"opt",		O_OPTIMIZE},		/*     4BSD */	{"para",	O_PARAGRAPHS},		/*     4BSD */	{"re",		O_REDRAW},		/* O'Reilly */	{"ro",		O_READONLY},		/*     4BSD (undocumented) */	{"scr",		O_SCROLL},		/*     4BSD (undocumented) */	{"sect",	O_SECTIONS},		/* O'Reilly */	{"sh",		O_SHELL},		/*     4BSD */	{"slow",	O_SLOWOPEN},		/*     4BSD */	{"sm",		O_SHOWMATCH},		/*     4BSD */	{"sw",		O_SHIFTWIDTH},		/*     4BSD */	{"tag",		O_TAGS},		/*     4BSD (undocumented) */	{"tl",		O_TAGLENGTH},		/*     4BSD */	{"to",		O_TIMEOUT},		/*     4BSD (undocumented) */	{"ts",		O_TABSTOP},		/*     4BSD */	{"tty",		O_TERM},		/*     4BSD (undocumented) */	{"ttytype",	O_TERM},		/*     4BSD (undocumented) */	{"w",		O_WINDOW},		/* O'Reilly */	{"wa",		O_WRITEANY},		/*     4BSD */	{"wi",		O_WINDOW},		/*     4BSD (undocumented) */	{"wm",		O_WRAPMARGIN},		/*     4BSD */	{"ws",		O_WRAPSCAN},		/*     4BSD */	{NULL},};/* * opts_init -- *	Initialize some of the options.  Since the user isn't really *	"setting" these variables, don't set their OPT_SET bits. */intopts_init(sp)	SCR *sp;{	ARGS *argv[2], a, b;	OPTLIST const *op;	u_long v;	int cnt;	char *s, b1[1024];	a.bp = b1;	a.len = 0;	b.bp = NULL;	b.len = 0;	argv[0] = &a;	argv[1] = &b;#define	SET_DEF(opt, str) {						\	if (str != b1)		/* GCC puts strings in text-space. */	\		(void)strcpy(b1, str);					\	a.len = strlen(b1);						\	if (opts_set(sp, argv)) {					\		msgq(sp, M_ERR,						\		    "Unable to set default %s option", optlist[opt]);	\		return (1);						\	}								\	F_CLR(&sp->opts[opt], OPT_SET);					\}	/* Set default values. */	for (op = optlist, cnt = 0; op->name != NULL; ++op, ++cnt)		if (op->type == OPT_0BOOL)			O_CLR(sp, cnt);		else if (op->type == OPT_1BOOL)			O_SET(sp, cnt);	(void)snprintf(b1, sizeof(b1), "cdpath=%s",	    (s = getenv("CDPATH")) == NULL ? ":" : s);	SET_DEF(O_CDPATH, b1);	/*	 * !!!	 * Vi historically stored temporary files in /var/tmp.  We store them	 * in /tmp by default, hoping it's a memory based file system.  There	 * are two ways to change this -- the user can set either the directory	 * option or the TMPDIR environmental variable.	 */	(void)snprintf(b1, sizeof(b1), "directory=%s",	    (s = getenv("TMPDIR")) == NULL ? _PATH_TMP : s);	SET_DEF(O_DIRECTORY, b1);	SET_DEF(O_KEYTIME, "keytime=6");	SET_DEF(O_MATCHTIME, "matchtime=7");	SET_DEF(O_REPORT, "report=5");	SET_DEF(O_PARAGRAPHS, "paragraphs=IPLPPPQPP LIpplpipbp");	(void)snprintf(b1, sizeof(b1), "recdir=%s", _PATH_PRESERVE);	SET_DEF(O_RECDIR, b1);	(void)snprintf(b1, sizeof(b1), "scroll=%ld", O_VAL(sp, O_LINES) / 2);	SET_DEF(O_SCROLL, b1);	SET_DEF(O_SECTIONS, "sections=NHSHH HUnhsh");	(void)snprintf(b1, sizeof(b1), "shell=%s",	    (s = getenv("SHELL")) == NULL ? _PATH_BSHELL : s);	SET_DEF(O_SHELL, b1);	SET_DEF(O_SHIFTWIDTH, "shiftwidth=8");	SET_DEF(O_SIDESCROLL, "sidescroll=16");	SET_DEF(O_TABSTOP, "tabstop=8");	(void)snprintf(b1, sizeof(b1), "tags=%s", _PATH_TAGS);	SET_DEF(O_TAGS, b1);	(void)snprintf(b1, sizeof(b1), "term=%s",	    (s = getenv("TERM")) == NULL ? "unknown" : s);	SET_DEF(O_TERM, b1);	/*	 * The default window option values are:	 *		8 if baud rate <=  600	 *	       16 if baud rate <= 1200	 *	LINES - 1 if baud rate  > 1200	 */	v = baud_from_bval(sp);	if (v <= 600)		v = 8;	else if (v <= 1200)		v = 16;	else		v = O_VAL(sp, O_LINES) - 1;	(void)snprintf(b1, sizeof(b1), "window=%lu", v);	SET_DEF(O_WINDOW, b1);	SET_DEF(O_WRAPMARGIN, "wrapmargin=0");	/*	 * By default, the historic vi always displayed information	 * about two options, redraw and term.  Term seems sufficient.	 */	F_SET(&sp->opts[O_TERM], OPT_SET);	return (0);}/* * opts_set -- *	Change the values of one or more options. */intopts_set(sp, argv)	SCR *sp;	ARGS *argv[];{	enum optdisp disp;	OABBREV atmp, *ap;	OPTLIST const *op;	OPTLIST otmp;	OPTION *spo;	u_long value, turnoff;	int ch, offset, rval;	char *endp, *equals, *name, *p;	disp = NO_DISPLAY;	for (rval = 0; (*argv)->len != 0; ++argv) {		/*		 * The historic vi dumped the options for each occurrence of		 * "all" in the set list.  Puhleeze.		 */		if (!strcmp(argv[0]->bp, "all")) {			disp = ALL_DISPLAY;			continue;		}		/* Find equals sign or end of set, skipping backquoted chars. */		for (equals = NULL,		    p = name = argv[0]->bp; (ch = *p) != '\0'; ++p)			switch (ch) {			case '=':				equals = p;				break;			case '\\':				/* Historic vi just used the backslash. */				if (p[1] == '\0')					break;				++p;				break;			}		turnoff = 0;		op = NULL;		if (equals)			*equals++ = '\0';		/* Check list of abbreviations. */		atmp.name = name;		if ((ap = bsearch(&atmp, abbrev,		    sizeof(abbrev) / sizeof(OABBREV) - 1,		    sizeof(OABBREV), opts_abbcmp)) != NULL) {			op = optlist + ap->offset;			goto found;		}		/* Check list of options. */		otmp.name = name;		if ((op = bsearch(&otmp, optlist,		    sizeof(optlist) / sizeof(OPTLIST) - 1,		    sizeof(OPTLIST), opts_cmp)) != NULL)			goto found;		/* Try the name without any leading "no". */		if (name[0] == 'n' && name[1] == 'o') {			turnoff = 1;			name += 2;		} else			goto prefix;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -