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

📄 param.c

📁 STEVIE文本文件编缉器的C 语言源程序
💻 C
字号:
/* $Header: /nw2/tony/src/stevie/src/RCS/param.c,v 1.10 89/08/02 10:59:10 tony Exp $
 *
 * Code to handle user-settable parameters. This is all pretty much table-
 * driven. To add a new parameter, put it in the params array, and add a
 * macro for it in param.h. If it's a numeric parameter, add any necessary
 * bounds checks to doset(). String parameters aren't currently supported.
 */

#include "stevie.h"

struct	param	params[] = {

	{ "tabstop",	"ts",		8,	P_NUM },
	{ "scroll",	"scroll",	12,	P_NUM },
	{ "report",	"report",	5,	P_NUM },
	{ "lines",	"lines",	25,	P_NUM },

	{ "vbell",	"vb",		TRUE,	P_BOOL },
	{ "showmatch",	"sm",		FALSE,	P_BOOL },
	{ "wrapscan",	"ws",		TRUE,	P_BOOL },
	{ "errorbells",	"eb",		FALSE,	P_BOOL },
	{ "showmode",	"mo",		FALSE,	P_BOOL },
	{ "backup",	"bk",		FALSE,	P_BOOL },
	{ "return",	"cr",		TRUE,	P_BOOL },
	{ "list",	"list",		FALSE,	P_BOOL },
	{ "ignorecase",	"ic",		FALSE,	P_BOOL },
	{ "autoindent",	"ai",		FALSE,	P_BOOL },
	{ "number",	"nu",		FALSE,	P_BOOL },
	{ "modelines",	"ml",		FALSE,	P_BOOL },
	{ "tildeop",	"to",		FALSE,	P_BOOL },
	{ "terse",	"terse",	FALSE,	P_BOOL },
	{ "",		"",		0,	0, }		/* end marker */

};

static	void	showparms();

void
doset(arg)
char	*arg;		/* parameter string */
{
	register int	i;
	register char	*s;
	bool_t	did_lines = FALSE;
	bool_t	state = TRUE;		/* new state of boolean parms. */

	if (arg == NULL) {
		showparms(FALSE);
		return;
	}
	if (strncmp(arg, "all", 3) == 0) {
		showparms(TRUE);
		return;
	}
	if (strncmp(arg, "no", 2) == 0) {
		state = FALSE;
		arg += 2;
	}

	for (i=0; params[i].fullname[0] != NUL ;i++) {
		s = params[i].fullname;
		if (strncmp(arg, s, strlen(s)) == 0)	/* matched full name */
			break;
		s = params[i].shortname;
		if (strncmp(arg, s, strlen(s)) == 0)	/* matched short name */
			break;
	}

	if (params[i].fullname[0] != NUL) {	/* found a match */
		if (params[i].flags & P_NUM) {
			did_lines = (i == P_LI);
			if (arg[strlen(s)] != '=' || state == FALSE)
				emsg("Invalid set of numeric parameter");
			else {
				params[i].value = atoi(arg+strlen(s)+1);
				params[i].flags |= P_CHANGED;
			}
		} else /* boolean */ {
			if (arg[strlen(s)] == '=')
				emsg("Invalid set of boolean parameter");
			else {
				params[i].value = state;
				params[i].flags |= P_CHANGED;
			}
		}
	} else
		emsg("Unrecognized 'set' option");

	/*
	 * Update the screen in case we changed something like "tabstop"
	 * or "list" that will change its appearance.
	 */
	updatescreen();

	if (did_lines) {
		Rows = P(P_LI);
		screenalloc();		/* allocate new screen buffers */
		screenclear();
		updatescreen();
	}
	/*
	 * Check the bounds for numeric parameters here
	 */
	if (P(P_TS) <= 0 || P(P_TS) > 32) {
		emsg("Invalid tab size specified");
		P(P_TS) = 8;
		return;
	}

	if (P(P_SS) <= 0 || P(P_SS) > Rows) {
		emsg("Invalid scroll size specified");
		P(P_SS) = 12;
		return;
	}

#ifndef	TILDEOP
	if (P(P_TO)) {
		emsg("Tilde-operator not enabled");
		P(P_TO) = FALSE;
		return;
	}
#endif
	/*
	 * Check for another argument, and call doset() recursively, if
	 * found. If any argument results in an error, no further
	 * parameters are processed.
	 */
	while (*arg != ' ' && *arg != '\t') {	/* skip to next white space */
		if (*arg == NUL)
			return;			/* end of parameter list */
		arg++;
	}
	while (*arg == ' ' || *arg == '\t')	/* skip to next non-white */
		arg++;

	if (*arg)
		doset(arg);	/* recurse on next parameter */
}

static	void
showparms(all)
bool_t	all;	/* show ALL parameters */
{
	register struct	param	*p;
	char	buf[64];

	gotocmd(TRUE, 0);
	outstr("Parameters:\r\n");

	for (p = &params[0]; p->fullname[0] != NUL ;p++) {
		if (!all && ((p->flags & P_CHANGED) == 0))
			continue;
		if (p->flags & P_BOOL)
			sprintf(buf, "\t%s%s\r\n",
				(p->value ? "" : "no"), p->fullname);
		else
			sprintf(buf, "\t%s=%d\r\n", p->fullname, p->value);

		outstr(buf);
	}
	wait_return();
}

⌨️ 快捷键说明

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