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

📄 search.c

📁 asterisk 是一个很有知名度开源软件
💻 C
📖 第 1 页 / 共 2 页
字号:
			}			break;		}		while (el->el_line.lastchar > el->el_line.buffer &&		    *el->el_line.lastchar != '\n')			*el->el_line.lastchar-- = '\0';		*el->el_line.lastchar = '\0';		if (!done) {			/* Can't search if unmatched '[' */			for (cp = &el->el_search.patbuf[el->el_search.patlen-1],			    ch = ']';			    cp > el->el_search.patbuf;			    cp--)				if (*cp == '[' || *cp == ']') {					ch = *cp;					break;				}			if (el->el_search.patlen > 1 && ch != '[') {				if (redo && newdir == dir) {					if (pchar == '?') { /* wrap around */						el->el_history.eventno =						    newdir == ED_SEARCH_PREV_HISTORY ? 0 : 0x7fffffff;						if (hist_get(el) == CC_ERROR)							/* el->el_history.event							 * no was fixed by							 * first call */							(void) hist_get(el);						el->el_line.cursor = newdir ==						    ED_SEARCH_PREV_HISTORY ?						    el->el_line.lastchar :						    el->el_line.buffer;					} else						el->el_line.cursor +=						    newdir ==						    ED_SEARCH_PREV_HISTORY ?						    -1 : 1;				}#ifdef ANCHOR				el->el_search.patbuf[el->el_search.patlen++] =				    '.';				el->el_search.patbuf[el->el_search.patlen++] =				    '*';#endif				el->el_search.patbuf[el->el_search.patlen] =				    '\0';				if (el->el_line.cursor < el->el_line.buffer ||				    el->el_line.cursor > el->el_line.lastchar ||				    (ret = ce_search_line(el,				    &el->el_search.patbuf[1],				    newdir)) == CC_ERROR) {					/* avoid c_setpat */					el->el_state.lastcmd =					    (el_action_t) newdir;					ret = newdir == ED_SEARCH_PREV_HISTORY ?					    ed_search_prev_history(el, 0) :					    ed_search_next_history(el, 0);					if (ret != CC_ERROR) {						el->el_line.cursor = newdir ==						    ED_SEARCH_PREV_HISTORY ?						    el->el_line.lastchar :						    el->el_line.buffer;						(void) ce_search_line(el,						    &el->el_search.patbuf[1],						    newdir);					}				}				el->el_search.patbuf[--el->el_search.patlen] =				    '\0';				if (ret == CC_ERROR) {					term_beep(el);					if (el->el_history.eventno !=					    ohisteventno) {						el->el_history.eventno =						    ohisteventno;						if (hist_get(el) == CC_ERROR)							return (CC_ERROR);					}					el->el_line.cursor = ocursor;					pchar = '?';				} else {					pchar = ':';				}			}			ret = ce_inc_search(el, newdir);			if (ret == CC_ERROR && pchar == '?' && oldpchar == ':')				/*				 * break abort of failed search at last				 * non-failed				 */				ret = CC_NORM;		}		if (ret == CC_NORM || (ret == CC_ERROR && oldpatlen == 0)) {			/* restore on normal return or error exit */			pchar = oldpchar;			el->el_search.patlen = oldpatlen;			if (el->el_history.eventno != ohisteventno) {				el->el_history.eventno = ohisteventno;				if (hist_get(el) == CC_ERROR)					return (CC_ERROR);			}			el->el_line.cursor = ocursor;			if (ret == CC_ERROR)				re_refresh(el);		}		if (done || ret != CC_NORM)			return (ret);	}}/* cv_search(): *	Vi search. */protected el_action_tcv_search(EditLine *el, int dir){	char ch;	char tmpbuf[EL_BUFSIZ];	int tmplen;	tmplen = 0;#ifdef ANCHOR	tmpbuf[tmplen++] = '.';	tmpbuf[tmplen++] = '*';#endif	el->el_line.buffer[0] = '\0';	el->el_line.lastchar = el->el_line.buffer;	el->el_line.cursor = el->el_line.buffer;	el->el_search.patdir = dir;	c_insert(el, 2);	/* prompt + '\n' */	*el->el_line.cursor++ = '\n';	*el->el_line.cursor++ = dir == ED_SEARCH_PREV_HISTORY ? '/' : '?';	re_refresh(el);#ifdef ANCHOR#define	LEN	2#else#define	LEN	0#endif	tmplen = c_gets(el, &tmpbuf[LEN]) + LEN;	ch = tmpbuf[tmplen];	tmpbuf[tmplen] = '\0';	if (tmplen == LEN) {		/*		 * Use the old pattern, but wild-card it.		 */		if (el->el_search.patlen == 0) {			el->el_line.buffer[0] = '\0';			el->el_line.lastchar = el->el_line.buffer;			el->el_line.cursor = el->el_line.buffer;			re_refresh(el);			return (CC_ERROR);		}#ifdef ANCHOR		if (el->el_search.patbuf[0] != '.' &&		    el->el_search.patbuf[0] != '*') {			(void) strncpy(tmpbuf, el->el_search.patbuf,			    sizeof(tmpbuf) - 1);			el->el_search.patbuf[0] = '.';			el->el_search.patbuf[1] = '*';			(void) strncpy(&el->el_search.patbuf[2], tmpbuf,			    EL_BUFSIZ - 3);			el->el_search.patlen++;			el->el_search.patbuf[el->el_search.patlen++] = '.';			el->el_search.patbuf[el->el_search.patlen++] = '*';			el->el_search.patbuf[el->el_search.patlen] = '\0';		}#endif	} else {#ifdef ANCHOR		tmpbuf[tmplen++] = '.';		tmpbuf[tmplen++] = '*';#endif		tmpbuf[tmplen] = '\0';		(void) strncpy(el->el_search.patbuf, tmpbuf, EL_BUFSIZ - 1);		el->el_search.patlen = tmplen;	}	el->el_state.lastcmd = (el_action_t) dir;	/* avoid c_setpat */	el->el_line.cursor = el->el_line.lastchar = el->el_line.buffer;	if ((dir == ED_SEARCH_PREV_HISTORY ? ed_search_prev_history(el, 0) :		ed_search_next_history(el, 0)) == CC_ERROR) {		re_refresh(el);		return (CC_ERROR);	} else {		if (ch == 0033) {			re_refresh(el);			*el->el_line.lastchar++ = '\n';			*el->el_line.lastchar = '\0';			re_goto_bottom(el);			return (CC_NEWLINE);		} else			return (CC_REFRESH);	}}/* ce_search_line(): *	Look for a pattern inside a line */protected el_action_tce_search_line(EditLine *el, char *pattern, int dir){	char *cp;	if (dir == ED_SEARCH_PREV_HISTORY) {		for (cp = el->el_line.cursor; cp >= el->el_line.buffer; cp--)			if (el_match(cp, pattern)) {				el->el_line.cursor = cp;				return (CC_NORM);			}		return (CC_ERROR);	} else {		for (cp = el->el_line.cursor; *cp != '\0' &&		    cp < el->el_line.limit; cp++)			if (el_match(cp, pattern)) {				el->el_line.cursor = cp;				return (CC_NORM);			}		return (CC_ERROR);	}}/* cv_repeat_srch(): *	Vi repeat search */protected el_action_tcv_repeat_srch(EditLine *el, int c){#ifdef SDEBUG	(void) fprintf(el->el_errfile, "dir %d patlen %d patbuf %s\n",	    c, el->el_search.patlen, el->el_search.patbuf);#endif	el->el_state.lastcmd = (el_action_t) c;	/* Hack to stop c_setpat */	el->el_line.lastchar = el->el_line.buffer;	switch (c) {	case ED_SEARCH_NEXT_HISTORY:		return (ed_search_next_history(el, 0));	case ED_SEARCH_PREV_HISTORY:		return (ed_search_prev_history(el, 0));	default:		return (CC_ERROR);	}}/* cv_csearch_back(): *	Vi character search reverse */protected el_action_tcv_csearch_back(EditLine *el, int ch, int count, int tflag){	char *cp;	cp = el->el_line.cursor;	while (count--) {		if (*cp == ch)			cp--;		while (cp > el->el_line.buffer && *cp != ch)			cp--;	}	if (cp < el->el_line.buffer || (cp == el->el_line.buffer && *cp != ch))		return (CC_ERROR);	if (*cp == ch && tflag)		cp++;	el->el_line.cursor = cp;	if (el->el_chared.c_vcmd.action & DELETE) {		el->el_line.cursor++;		cv_delfini(el);		return (CC_REFRESH);	}	re_refresh_cursor(el);	return (CC_NORM);}/* cv_csearch_fwd(): *	Vi character search forward */protected el_action_tcv_csearch_fwd(EditLine *el, int ch, int count, int tflag){	char *cp;	cp = el->el_line.cursor;	while (count--) {		if (*cp == ch)			cp++;		while (cp < el->el_line.lastchar && *cp != ch)			cp++;	}	if (cp >= el->el_line.lastchar)		return (CC_ERROR);	if (*cp == ch && tflag)		cp--;	el->el_line.cursor = cp;	if (el->el_chared.c_vcmd.action & DELETE) {		el->el_line.cursor++;		cv_delfini(el);		return (CC_REFRESH);	}	re_refresh_cursor(el);	return (CC_NORM);}

⌨️ 快捷键说明

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