亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? cmdline.c

?? STEVIE文本文件編緝器的C 語言源程序
?? C
字號:
/* $Header: /nw2/tony/src/stevie/src/RCS/cmdline.c,v 1.22 89/08/31 10:00:23 tony Exp $
 *
 * Routines to parse and execute "command line" commands, such as searches
 * or colon commands.
 */

#include "stevie.h"

static	char	*altfile = NULL;	/* alternate file */
static	int	altline;		/* line # in alternate file */

static	char	*nowrtmsg = "No write since last change (use ! to override)";
static	char	*nooutfile = "No output file";
static	char	*morefiles = "more files to edit";

extern	char	**files;		/* used for "n" and "rew" */
extern	int	numfiles, curfile;

#define	CMDSZ	100		/* size of the command buffer */

static	bool_t	doecmd();
static	void	badcmd(), get_range();
static	LPTR	*get_line();

/*
 * getcmdln() - read a command line from the terminal
 *
 * Reads a command line started by typing '/', '?', '!', or ':'. Returns a
 * pointer to the string that was read. For searches, an optional trailing
 * '/' or '?' is removed.
 */
char *
getcmdln(firstc)
char	firstc;
{
	static	char	buff[CMDSZ];
	register char	*p = buff;
	register int	c;
	register char	*q;

	gotocmd(TRUE, firstc);

	/* collect the command string, handling '\b' and @ */
	do {
		switch (c = vgetc()) {

		default:		/* a normal character */
			outchar(c);
			*p++ = c;
			break;

		case BS:
			if (p > buff) {
				/*
				 * this is gross, but it relies
				 * only on 'gotocmd'
				 */
				p--;
				gotocmd(TRUE, firstc);
				for (q = buff; q < p ;q++)
					outchar(*q);
			} else {
				msg("");
				return NULL;		/* back to cmd mode */
			}
			break;

		case '@':			/* line kill */
			p = buff;
			gotocmd(TRUE, firstc);
			break;

		case NL:			/* done reading the line */
		case CR:
			break;
		}
	} while (c != NL && c != CR);

	*p = '\0';

	if (firstc == '/' || firstc == '?') {	/* did we do a search? */
		/*
		 * Look for a terminating '/' or '?'. This will be the first
		 * one that isn't quoted. Truncate the search string there.
		 */
		for (p = buff; *p ;) {
			if (*p == firstc) {	/* we're done */
				*p = '\0';
				break;
			} else if (*p == '\\')	/* next char quoted */
				p += 2;
			else
				p++;		/* normal char */
		}
	}
	if (buff[0] == '\0')
		return NULL;

	return buff;
}

/*
 * docmdln() - handle a colon command
 *
 * Handles a colon command received interactively by getcmdln() or from
 * the environment variable "EXINIT" (or eventually .virc).
 */
void
docmdln(cmdline)
char	*cmdline;
{
	char	buff[CMDSZ];
	char	cmdbuf[CMDSZ];
	char	argbuf[CMDSZ];
	char	*cmd, *arg;
	register char	*p;
	/*
	 * The next two variables contain the bounds of any range given in a
	 * command. If no range was given, both contain null line pointers.
	 * If only a single line was given, u_pos will contain a null line
	 * pointer.
	 */
	LPTR	l_pos, u_pos;


	/*
	 * Clear the range variables.
	 */
	l_pos.linep = (struct line *) NULL;
	u_pos.linep = (struct line *) NULL;

	if (cmdline == NULL)
		return;

	if (strlen(cmdline) > CMDSZ-2) {
		msg("Error: command line too long");
		return;
	}
	strcpy(buff, cmdline);

	/* skip any initial white space */
	for (cmd = buff; *cmd != NUL && isspace(*cmd) ;cmd++)
		;

	if (*cmd == '%') {		/* change '%' to "1,$" */
		strcpy(cmdbuf, "1,$");	/* kind of gross... */
		strcat(cmdbuf, cmd+1);
		strcpy(cmd, cmdbuf);
	}

	while ((p=strchr(cmd, '%')) != NULL && *(p-1) != '\\') {
					/* change '%' to Filename */
		if (Filename == NULL) {
			emsg("No filename");
			return;
		}
		*p= NUL;
		strcpy (cmdbuf, cmd);
		strcat (cmdbuf, Filename);
		strcat (cmdbuf, p+1);
		strcpy(cmd, cmdbuf);
		msg(cmd);			/*repeat */
	}

	while ((p=strchr(cmd, '#')) != NULL && *(p-1) != '\\') {
					/* change '#' to Altname */
		if (altfile == NULL) {
			emsg("No alternate file");
			return;
		}
		*p= NUL;
		strcpy (cmdbuf, cmd);
		strcat (cmdbuf, altfile);
		strcat (cmdbuf, p+1);
		strcpy(cmd, cmdbuf);
		msg(cmd);			/*repeat */
	}

	/*
	 * Parse a range, if present (and update the cmd pointer).
	 */
	get_range(&cmd, &l_pos, &u_pos);

	if (l_pos.linep != NULL) {
		if (LINEOF(&l_pos) > LINEOF(&u_pos)) {
			emsg("Invalid range");
			return;
		}
	}

	strcpy(cmdbuf, cmd);	/* save the unmodified command */

	/* isolate the command and find any argument */
	for ( p=cmd; *p != NUL && ! isspace(*p); p++ )
		;
	if ( *p == NUL )
		arg = NULL;
	else {
		*p = NUL;
		for (p++; *p != NUL && isspace(*p) ;p++)
			;
		if (*p == NUL)
			arg = NULL;
		else {
			strcpy(argbuf, p);
			arg = argbuf;
		}
	}
	if (strcmp(cmd,"q!") == 0)
		getout();
	if (strcmp(cmd,"q") == 0) {
		if (Changed)
			emsg(nowrtmsg);
		else {
			if ((curfile + 1) < numfiles)
				emsg(morefiles);
			else
				getout();
		}
		return;
	}
	if (strcmp(cmd,"w") == 0) {
		if (arg == NULL) {
			if (Filename != NULL) {
				writeit(Filename, &l_pos, &u_pos);
			} else
				emsg(nooutfile);
		}
		else
			writeit(arg, &l_pos, &u_pos);
		return;
	}
	if (strcmp(cmd,"wq") == 0) {
		if (Filename != NULL) {
			if (writeit(Filename, (LPTR *)NULL, (LPTR *)NULL))
				getout();
		} else
			emsg(nooutfile);
		return;
	}
	if (strcmp(cmd, "x") == 0) {
		doxit();
		return;
	}

	if (strcmp(cmd,"f") == 0 && arg == NULL) {
		fileinfo();
		return;
	}
	if (*cmd == 'n') {
		if ((curfile + 1) < numfiles) {
			/*
			 * stuff ":e[!] FILE\n"
			 */
			stuffin(":e");
			if (cmd[1] == '!')
				stuffin("!");
			stuffin(" ");
			stuffin(files[++curfile]);
			stuffin("\n");
		} else
			emsg("No more files!");
		return;
	}
	if (*cmd == 'N') {
		if (curfile > 0) {
			/*
			 * stuff ":e[!] FILE\n"
			 */
			stuffin(":e");
			if (cmd[1] == '!')
				stuffin("!");
			stuffin(" ");
			stuffin(files[--curfile]);
			stuffin("\n");
		} else
			emsg("No more files!");
		return;
	}
	if (strncmp(cmd, "rew", 3) == 0) {
		if (numfiles <= 1)		/* nothing to rewind */
			return;
		curfile = 0;
		/*
		 * stuff ":e[!] FILE\n"
		 */
		stuffin(":e");
		if (cmd[3] == '!')
			stuffin("!");
		stuffin(" ");
		stuffin(files[0]);
		stuffin("\n");
		return;
	}
	if (strcmp(cmd,"e") == 0 || strcmp(cmd,"e!") == 0) {
		(void) doecmd(arg, cmd[1] == '!');
		return;
	}
	/*
	 * The command ":e#" gets expanded to something like ":efile", so
	 * detect that case here.
	 */
	if (*cmd == 'e' && arg == NULL) {
		if (cmd[1] == '!')
			(void) doecmd(&cmd[2], TRUE);
		else
			(void) doecmd(&cmd[1], FALSE);
		return;
	}
	if (strcmp(cmd,"f") == 0) {
		Filename = strsave(arg);
		filemess("");
		return;
	}
	if (strcmp(cmd,"r") == 0) {
		if (arg == NULL) {
			badcmd();
			return;
		}
		if (readfile(arg, Curschar, 1)) {
			emsg("Can't open file");
			return;
		}
		updatescreen();
		CHANGED;
		return;
	}
	if (strcmp(cmd,"=") == 0) {
		smsg("%d", cntllines(Filemem, &l_pos));
		return;
	}
	if (strncmp(cmd,"ta", 2) == 0) {
		dotag(arg, cmd[2] == '!');
		return;
	}
	if (strncmp(cmd,"set", 2) == 0) {
		doset(arg);
		return;
	}
	if (strcmp(cmd,"help") == 0) {
		if (help()) {
			screenclear();
			updatescreen();
		}
		return;
	}
	if (strncmp(cmd, "ve", 2) == 0) {
		extern	char	*Version;

		msg(Version);
		return;
	}
	if (strcmp(cmd, "sh") == 0) {
		doshell(NULL);
		return;
	}
	if (*cmd == '!') {
		doshell(cmdbuf+1);
		return;
	}
	if (strncmp(cmd, "s/", 2) == 0) {
		dosub(&l_pos, &u_pos, cmdbuf+1);
		return;
	}
	if (strncmp(cmd, "g/", 2) == 0) {
		doglob(&l_pos, &u_pos, cmdbuf+1);
		return;
	}
	/*
	 * If we got a line, but no command, then go to the line.
	 */
	if (*cmd == NUL && l_pos.linep != NULL) {
		*Curschar = l_pos;
		return;
	}

	badcmd();
}


doxit()
{
	if (Changed) {
		if (Filename != NULL) {
			if (!writeit(Filename, (LPTR *)NULL, (LPTR *)NULL))
				return;
		} else {
			emsg(nooutfile);
			return;
		}
	}
	if ((curfile + 1) < numfiles)
		emsg(morefiles);
	else
		getout();
}

/*
 * get_range - parse a range specifier
 *
 * Ranges are of the form:
 *
 * addr[,addr]
 *
 * where 'addr' is:
 *
 * $  [+- NUM]
 * 'x [+- NUM]	(where x denotes a currently defined mark)
 * .  [+- NUM]
 * NUM
 *
 * The pointer *cp is updated to point to the first character following
 * the range spec. If an initial address is found, but no second, the
 * upper bound is equal to the lower.
 */
static void
get_range(cp, lower, upper)
register char	**cp;
LPTR	*lower, *upper;
{
	register LPTR	*l;
	register char	*p;

	if ((l = get_line(cp)) == NULL)
		return;

	*lower = *l;

	for (p = *cp; *p != NUL && isspace(*p) ;p++)
		;

	*cp = p;

	if (*p != ',') {		/* is there another line spec ? */
		*upper = *lower;
		return;
	}

	*cp = ++p;

	if ((l = get_line(cp)) == NULL) {
		*upper = *lower;
		return;
	}

	*upper = *l;
}

static LPTR *
get_line(cp)
char	**cp;
{
	static	LPTR	pos;
	LPTR	*lp;
	register char	*p, c;
	register int	lnum;

	pos.index = 0;		/* shouldn't matter... check back later */

	p = *cp;
	/*
	 * Determine the basic form, if present.
	 */
	switch (c = *p++) {

	case '$':
		pos.linep = Fileend->linep->prev;
		break;

	case '.':
		pos.linep = Curschar->linep;
		break;

	case '\'':
		if ((lp = getmark(*p++)) == NULL) {
			emsg("Unknown mark");
			return (LPTR *) NULL;
		}
		pos = *lp;
		break;

	case '0': case '1': case '2': case '3': case '4':
	case '5': case '6': case '7': case '8': case '9':
		for (lnum = c - '0'; isdigit(*p) ;p++)
			lnum = (lnum * 10) + (*p - '0');

		pos = *gotoline(lnum);
		break;

	default:
		return (LPTR *) NULL;
	}

	while (*p != NUL && isspace(*p))
		p++;

	if (*p == '-' || *p == '+') {
		bool_t	neg = (*p++ == '-');

		for (lnum = 0; isdigit(*p) ;p++)
			lnum = (lnum * 10) + (*p - '0');

		if (neg)
			lnum = -lnum;

		pos = *gotoline( cntllines(Filemem, &pos) + lnum );
	}

	*cp = p;
	return &pos;
}

static void
badcmd()
{
	emsg("Unrecognized command");
}

#define	LSIZE	256	/* max. size of a line in the tags file */

/*
 * dotag(tag, force) - goto tag
 */
void
dotag(tag, force)
char	*tag;
bool_t	force;
{
	FILE	*tp, *fopen();
	char	lbuf[LSIZE];		/* line buffer */
	char	pbuf[LSIZE];		/* search pattern buffer */
	register char	*fname, *str;
	register char	*p;

	if ((tp = fopen("tags", "r")) == NULL) {
		emsg("Can't open tags file");
		return;
	}

	while (fgets(lbuf, LSIZE, tp) != NULL) {
	
		if ((fname = strchr(lbuf, TAB)) == NULL) {
			emsg("Format error in tags file");
			return;
		}
		*fname++ = '\0';
		if ((str = strchr(fname, TAB)) == NULL) {
			emsg("Format error in tags file");
			return;
		}
		*str++ = '\0';

		if (strcmp(lbuf, tag) == 0) {

			/*
			 * Scan through the search string. If we see a magic
			 * char, we have to quote it. This lets us use "real"
			 * implementations of ctags.
			 */
			p = pbuf;
			*p++ = *str++;		/* copy the '/' or '?' */
			*p++ = *str++;		/* copy the '^' */

			for (; *str != NUL ;str++) {
				if (*str == '\\') {
					*p++ = *str++;
					*p++ = *str;
				} else if (strchr("/?", *str) != NULL) {
					if (str[1] != '\n') {
						*p++ = '\\';
						*p++ = *str;
					} else
						*p++ = *str;
				} else if (strchr("^()*.", *str) != NULL) {
					*p++ = '\\';
					*p++ = *str;
				} else
					*p++ = *str;
			}
			*p = NUL;

			/*
			 * This looks out of order, but by calling stuffin()
			 * before doecmd() we keep an extra screen update
			 * from occuring. This stuffins() have no effect
			 * until we get back to the main loop, anyway.
			 */
			stuffin(pbuf);		/* str has \n at end */
			stuffin("\007");	/* CTRL('g') */

			if (doecmd(fname, force)) {
				fclose(tp);
				return;
			} else
				stuffin(NULL);	/* clear the input */
		}
	}
	emsg("tag not found");
	fclose(tp);
}

static	bool_t
doecmd(arg, force)
char	*arg;
bool_t	force;
{
	int	line = 1;		/* line # to go to in new file */

	if (!force && Changed) {
		emsg(nowrtmsg);
		if (altfile)
			free(altfile);
		altfile = strsave(arg);
		return FALSE;
	}
	if (arg != NULL) {
		/*
		 * First detect a ":e" on the current file. This is mainly
		 * for ":ta" commands where the destination is within the
		 * current file.
		 */
		if (Filename != NULL && strcmp(arg, Filename) == 0) {
			if (!Changed || (Changed && !force))
				return TRUE;
		}
		if (altfile) {
			if (strcmp (arg, altfile) == 0)
				line = altline;
			free(altfile);
		}
		altfile = Filename;
		altline = cntllines(Filemem, Curschar);
		Filename = strsave(arg);
	}
	if (Filename == NULL) {
		emsg("No filename");
		return FALSE;
	}

	/* clear mem and read file */
	freeall();
	filealloc();
	UNCHANGED;

	if (readfile(Filename, Filemem, 0))
		filemess("[New File]");

	*Topchar = *Curschar;
	if (line != 1) {
		stuffnum(line);
		stuffin("G");
	}
	do_mlines();
	setpcmark();
	updatescreen();
	return TRUE;
}

void
gotocmd(clr, firstc)
bool_t  clr;
char	firstc;
{
	windgoto(Rows-1,0);
	if (clr)
		outcstr(T_EL);		/* clear the bottom line */
	if (firstc)
		outchar(firstc);
}

/*
 * msg(s) - displays the string 's' on the status line
 */
void
msg(s)
char	*s;
{
	gotocmd(TRUE, 0);
	outstr(s);
	flushbuf();
}

/*VARARGS1*/
void
smsg(s, a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16)
char	*s;
int	a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16;
{
	char	sbuf[80];

	sprintf(sbuf, s,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16);
	msg(sbuf);
}

/*
 * emsg() - display an error message
 *
 * Rings the bell, if appropriate, and calls message() to do the real work
 */
void
emsg(s)
char	*s;
{
	if (P(P_EB))
		beep();
	msg(s);
}

void
wait_return()
{
	register char	c;

	if (got_int)
		outstr("Interrupt: ");

	outstr("Press RETURN to continue");
	do {
		c = vgetc();
	} while (c != CR && c != NL && c != ' ' && c != ':');

	if (c == ':') {
		outchar(NL);
		docmdln(getcmdln(c));
	} else
		screenclear();

	updatescreen();
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产天堂亚洲国产碰碰| 亚洲精品一线二线三线| 国产精品系列在线播放| 日韩av网站免费在线| 亚洲综合丁香婷婷六月香| 一区二区三区在线看| 亚洲欧美日本在线| 一区二区在线看| 玉米视频成人免费看| 亚洲综合小说图片| 亚洲成人av中文| 日本一道高清亚洲日美韩| 亚洲国产视频网站| 日韩成人精品在线观看| 狂野欧美性猛交blacked| 久久成人免费日本黄色| 国产一区不卡精品| 成人av网站在线观看免费| 99久久免费精品| 欧美在线制服丝袜| 制服视频三区第一页精品| 日韩欧美一二区| 中文无字幕一区二区三区| 国产精品麻豆网站| 亚洲一区在线观看免费 | 欧美女孩性生活视频| 欧美日本在线看| 久久综合久久99| 亚洲天堂中文字幕| 日韩成人av影视| 国产福利一区二区| 色成人在线视频| 日韩精品在线一区二区| 国产亚洲短视频| 亚洲国产裸拍裸体视频在线观看乱了| 首页欧美精品中文字幕| 国产精品综合网| 在线观看91视频| 久久久99精品免费观看| 亚洲激情在线播放| 久久99精品国产麻豆婷婷洗澡| 国产精品一级片| 精品视频在线看| 国产欧美日韩精品一区| 天堂va蜜桃一区二区三区漫画版| 国产在线视视频有精品| 欧洲av在线精品| 久久久久久9999| 亚洲国产一区在线观看| 国产iv一区二区三区| 欧美丰满少妇xxxxx高潮对白| 国产亚洲视频系列| 奇米色777欧美一区二区| 成人综合在线网站| 日韩欧美成人激情| 亚洲综合久久av| a4yy欧美一区二区三区| 精品国产精品网麻豆系列| 亚洲国产精品影院| 91同城在线观看| 国产精品视频你懂的| 久久超级碰视频| 欧美精品久久久久久久多人混战 | av在线不卡电影| 欧美精品一区二区久久婷婷| 一卡二卡三卡日韩欧美| 成人av在线播放网站| 国产欧美一区二区精品秋霞影院| 无码av中文一区二区三区桃花岛| 97se亚洲国产综合自在线观| 久久精品一区二区三区av| 久久成人综合网| 欧美成人免费网站| 五月婷婷久久综合| 欧美剧情片在线观看| 亚洲午夜精品一区二区三区他趣| 99精品久久久久久| 国产精品白丝在线| 91在线看国产| 亚洲视频网在线直播| 91美女视频网站| 一区二区三区在线播放| 欧美影视一区二区三区| 一区二区理论电影在线观看| 色综合久久久久综合99| 亚洲黄色av一区| 在线精品视频免费观看| 丝袜美腿亚洲综合| 欧美精品日韩一区| 九九国产精品视频| 久久久亚洲高清| 成人免费观看av| 综合电影一区二区三区| 欧美最猛性xxxxx直播| 偷拍一区二区三区四区| 日韩精品中文字幕一区| 国产成人在线视频网址| 亚洲色图欧洲色图婷婷| 欧美午夜电影网| 另类成人小视频在线| 久久老女人爱爱| 91色九色蝌蚪| 美女被吸乳得到大胸91| 国产欧美一区二区精品性| 一本色道久久综合亚洲精品按摩| 亚洲成人免费影院| 精品久久久久一区| 99re热这里只有精品免费视频| 亚洲精品伦理在线| 欧美一区二区三区色| 国产一区91精品张津瑜| 亚洲精品高清视频在线观看| 欧美疯狂性受xxxxx喷水图片| 黄色资源网久久资源365| 亚洲欧洲性图库| 在线播放欧美女士性生活| 国产成人精品免费网站| 亚洲成人精品一区二区| 国产亚洲欧洲997久久综合 | 婷婷成人激情在线网| 国产视频不卡一区| 欧美日韩在线观看一区二区| 国产一区不卡在线| 首页国产丝袜综合| 亚洲欧美偷拍卡通变态| 欧美一区二区福利在线| 91在线免费播放| 国产精品一区二区久久不卡 | 亚洲福利视频三区| 国产色综合一区| 91精品欧美久久久久久动漫 | 99久久久国产精品免费蜜臀| 日韩二区三区四区| 一区二区三区欧美在线观看| 26uuu亚洲综合色| 91精品国产综合久久精品app| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 亚洲综合一区二区| 国产清纯白嫩初高生在线观看91| 91精品国产福利| 欧美综合亚洲图片综合区| www.成人在线| 国产成人av电影在线| 国内外成人在线| 免费精品视频在线| 奇米影视在线99精品| 亚洲午夜羞羞片| 亚洲综合色噜噜狠狠| 最新欧美精品一区二区三区| 国产亚洲美州欧州综合国| 日韩欧美中文字幕制服| 欧美一区二区精品在线| 欧美剧情电影在线观看完整版免费励志电影| 懂色av一区二区三区蜜臀| 国产精品123区| 韩国一区二区在线观看| 韩国成人精品a∨在线观看| 久久9热精品视频| 精品一区二区在线免费观看| 免费不卡在线视频| 青青草国产精品亚洲专区无| 亚洲成人在线观看视频| 天天综合网 天天综合色| 午夜影院在线观看欧美| 丝袜美腿亚洲综合| 精品一区二区免费| 国产剧情一区二区三区| 豆国产96在线|亚洲| 不卡一卡二卡三乱码免费网站| 成人黄动漫网站免费app| 成人夜色视频网站在线观看| 亚洲成人免费电影| 欧美一区二区二区| 91污在线观看| 欧美日免费三级在线| 在线成人av影院| 精品盗摄一区二区三区| 国产欧美一区二区三区沐欲| 日韩伦理免费电影| 亚洲大片精品永久免费| 久久成人麻豆午夜电影| 成人综合在线观看| 精品视频色一区| 精品国产百合女同互慰| ...av二区三区久久精品| 天天综合色天天综合色h| 国产一区日韩二区欧美三区| 91尤物视频在线观看| 在线综合亚洲欧美在线视频| 久久婷婷久久一区二区三区| 亚洲免费在线视频| 日本不卡不码高清免费观看| 国产精品香蕉一区二区三区| 色综合天天做天天爱| 日韩免费看的电影| 一区二区三区四区乱视频| 极品少妇xxxx偷拍精品少妇| 91在线精品秘密一区二区| 欧美大黄免费观看| 亚洲精选免费视频|