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

📄 term.c

📁 asterisk 是一个很有知名度开源软件
💻 C
📖 第 1 页 / 共 3 页
字号:
	arrow[A_K_EN].name = "end";	arrow[A_K_EN].key = T_at7;	arrow[A_K_EN].fun.cmd = ED_MOVE_TO_END;	arrow[A_K_EN].type = XK_CMD;}/* term_reset_arrow(): *	Reset arrow key bindings */private voidterm_reset_arrow(EditLine *el){	fkey_t *arrow = el->el_term.t_fkey;	static const char strA[] = {033, '[', 'A', '\0'};	static const char strB[] = {033, '[', 'B', '\0'};	static const char strC[] = {033, '[', 'C', '\0'};	static const char strD[] = {033, '[', 'D', '\0'};	static const char strH[] = {033, '[', 'H', '\0'};	static const char strF[] = {033, '[', 'F', '\0'};	static const char stOA[] = {033, 'O', 'A', '\0'};	static const char stOB[] = {033, 'O', 'B', '\0'};	static const char stOC[] = {033, 'O', 'C', '\0'};	static const char stOD[] = {033, 'O', 'D', '\0'};	static const char stOH[] = {033, 'O', 'H', '\0'};	static const char stOF[] = {033, 'O', 'F', '\0'};	key_add(el, strA, &arrow[A_K_UP].fun, arrow[A_K_UP].type);	key_add(el, strB, &arrow[A_K_DN].fun, arrow[A_K_DN].type);	key_add(el, strC, &arrow[A_K_RT].fun, arrow[A_K_RT].type);	key_add(el, strD, &arrow[A_K_LT].fun, arrow[A_K_LT].type);	key_add(el, strH, &arrow[A_K_HO].fun, arrow[A_K_HO].type);	key_add(el, strF, &arrow[A_K_EN].fun, arrow[A_K_EN].type);	key_add(el, stOA, &arrow[A_K_UP].fun, arrow[A_K_UP].type);	key_add(el, stOB, &arrow[A_K_DN].fun, arrow[A_K_DN].type);	key_add(el, stOC, &arrow[A_K_RT].fun, arrow[A_K_RT].type);	key_add(el, stOD, &arrow[A_K_LT].fun, arrow[A_K_LT].type);	key_add(el, stOH, &arrow[A_K_HO].fun, arrow[A_K_HO].type);	key_add(el, stOF, &arrow[A_K_EN].fun, arrow[A_K_EN].type);	if (el->el_map.type == MAP_VI) {		key_add(el, &strA[1], &arrow[A_K_UP].fun, arrow[A_K_UP].type);		key_add(el, &strB[1], &arrow[A_K_DN].fun, arrow[A_K_DN].type);		key_add(el, &strC[1], &arrow[A_K_RT].fun, arrow[A_K_RT].type);		key_add(el, &strD[1], &arrow[A_K_LT].fun, arrow[A_K_LT].type);		key_add(el, &strH[1], &arrow[A_K_HO].fun, arrow[A_K_HO].type);		key_add(el, &strF[1], &arrow[A_K_EN].fun, arrow[A_K_EN].type);		key_add(el, &stOA[1], &arrow[A_K_UP].fun, arrow[A_K_UP].type);		key_add(el, &stOB[1], &arrow[A_K_DN].fun, arrow[A_K_DN].type);		key_add(el, &stOC[1], &arrow[A_K_RT].fun, arrow[A_K_RT].type);		key_add(el, &stOD[1], &arrow[A_K_LT].fun, arrow[A_K_LT].type);		key_add(el, &stOH[1], &arrow[A_K_HO].fun, arrow[A_K_HO].type);		key_add(el, &stOF[1], &arrow[A_K_EN].fun, arrow[A_K_EN].type);	}}/* term_set_arrow(): *	Set an arrow key binding */protected intterm_set_arrow(EditLine *el, const char *name, key_value_t *fun, int type){	fkey_t *arrow = el->el_term.t_fkey;	int i;	for (i = 0; i < A_K_NKEYS; i++)		if (strcmp(name, arrow[i].name) == 0) {			arrow[i].fun = *fun;			arrow[i].type = type;			return (0);		}	return (-1);}/* term_clear_arrow(): *	Clear an arrow key binding */protected intterm_clear_arrow(EditLine *el, const char *name){	fkey_t *arrow = el->el_term.t_fkey;	int i;	for (i = 0; i < A_K_NKEYS; i++)		if (strcmp(name, arrow[i].name) == 0) {			arrow[i].type = XK_NOD;			return (0);		}	return (-1);}/* term_print_arrow(): *	Print the arrow key bindings */protected voidterm_print_arrow(EditLine *el, const char *name){	int i;	fkey_t *arrow = el->el_term.t_fkey;	for (i = 0; i < A_K_NKEYS; i++)		if (*name == '\0' || strcmp(name, arrow[i].name) == 0)			if (arrow[i].type != XK_NOD)				key_kprint(el, arrow[i].name, &arrow[i].fun,				    arrow[i].type);}/* term_bind_arrow(): *	Bind the arrow keys */protected voidterm_bind_arrow(EditLine *el){	el_action_t *map;	const el_action_t *dmap;	int i, j;	char *p;	fkey_t *arrow = el->el_term.t_fkey;	/* Check if the components needed are initialized */	if (el->el_term.t_buf == NULL || el->el_map.key == NULL)		return;	map = el->el_map.type == MAP_VI ? el->el_map.alt : el->el_map.key;	dmap = el->el_map.type == MAP_VI ? el->el_map.vic : el->el_map.emacs;	term_reset_arrow(el);	for (i = 0; i < A_K_NKEYS; i++) {		p = el->el_term.t_str[arrow[i].key];		if (p && *p) {			j = (unsigned char) *p;			/*			 * Assign the arrow keys only if:			 *			 * 1. They are multi-character arrow keys and the user			 *    has not re-assigned the leading character, or			 *    has re-assigned the leading character to be			 *	  ED_SEQUENCE_LEAD_IN			 * 2. They are single arrow keys pointing to an			 *    unassigned key.			 */			if (arrow[i].type == XK_NOD)				key_clear(el, map, p);			else {				if (p[1] && (dmap[j] == map[j] ||					map[j] == ED_SEQUENCE_LEAD_IN)) {					key_add(el, p, &arrow[i].fun,					    arrow[i].type);					map[j] = ED_SEQUENCE_LEAD_IN;				} else if (map[j] == ED_UNASSIGNED) {					key_clear(el, map, p);					if (arrow[i].type == XK_CMD)						map[j] = arrow[i].fun.cmd;					else						key_add(el, p, &arrow[i].fun,						    arrow[i].type);				}			}		}	}}/* term__putc(): *	Add a character */protected intterm__putc(int c){	return (fputc(c, term_outfile));}/* term__flush(): *	Flush output */protected voidterm__flush(void){	(void) fflush(term_outfile);}/* term_telltc(): *	Print the current termcap characteristics */protected int/*ARGSUSED*/term_telltc(EditLine *el, int argc, const char **argv){	const struct termcapstr *t;	char **ts;	char upbuf[EL_BUFSIZ];	(void) fprintf(el->el_outfile, "\n\tYour terminal has the\n");	(void) fprintf(el->el_outfile, "\tfollowing characteristics:\n\n");	(void) fprintf(el->el_outfile, "\tIt has %d columns and %d lines\n",	    Val(T_co), Val(T_li));	(void) fprintf(el->el_outfile,	    "\tIt has %s meta key\n", EL_HAS_META ? "a" : "no");	(void) fprintf(el->el_outfile,	    "\tIt can%suse tabs\n", EL_CAN_TAB ? " " : "not ");	(void) fprintf(el->el_outfile, "\tIt %s automatic margins\n",	    EL_HAS_AUTO_MARGINS ? "has" : "does not have");	if (EL_HAS_AUTO_MARGINS)		(void) fprintf(el->el_outfile, "\tIt %s magic margins\n",		    EL_HAS_MAGIC_MARGINS ? "has" : "does not have");	for (t = tstr, ts = el->el_term.t_str; t->name != NULL; t++, ts++)		(void) fprintf(el->el_outfile, "\t%25s (%s) == %s\n",		    t->long_name,		    t->name, *ts && **ts ?		    key__decode_str(*ts, upbuf, "") : "(empty)");	(void) fputc('\n', el->el_outfile);	return (0);}/* term_settc(): *	Change the current terminal characteristics */protected int/*ARGSUSED*/term_settc(EditLine *el, int argc, const char **argv){	const struct termcapstr *ts;	const struct termcapval *tv;	const char *what, *how;	if (argv == NULL || argv[1] == NULL || argv[2] == NULL)		return (-1);	what = argv[1];	how = argv[2];	/*         * Do the strings first         */	for (ts = tstr; ts->name != NULL; ts++)		if (strcmp(ts->name, what) == 0)			break;	if (ts->name != NULL) {		term_alloc(el, ts, how);		term_setflags(el);		return (0);	}	/*         * Do the numeric ones second         */	for (tv = tval; tv->name != NULL; tv++)		if (strcmp(tv->name, what) == 0)			break;	if (tv->name != NULL) {		if (tv == &tval[T_pt] || tv == &tval[T_km] ||		    tv == &tval[T_am] || tv == &tval[T_xn]) {			if (strcmp(how, "yes") == 0)				el->el_term.t_val[tv - tval] = 1;			else if (strcmp(how, "no") == 0)				el->el_term.t_val[tv - tval] = 0;			else {				(void) fprintf(el->el_errfile,				    "settc: Bad value `%s'.\n", how);				return (-1);			}			term_setflags(el);			if (term_change_size(el, Val(T_li), Val(T_co)) == -1)				return (-1);			return (0);		} else {			long i;			char *ep;			i = strtol(how, &ep, 10);			if (*ep != '\0') {				(void) fprintf(el->el_errfile,				    "settc: Bad value `%s'.\n", how);				return (-1);			}			el->el_term.t_val[tv - tval] = (int) i;			el->el_term.t_size.v = Val(T_co);			el->el_term.t_size.h = Val(T_li);			if (tv == &tval[T_co] || tv == &tval[T_li])				if (term_change_size(el, Val(T_li), Val(T_co))				    == -1)					return (-1);			return (0);		}	}	return (-1);}/* term_echotc(): *	Print the termcap string out with variable substitution */protected int/*ARGSUSED*/term_echotc(EditLine *el, int argc, const char **argv){	char *cap, *scap, *ep;	int arg_need, arg_cols, arg_rows;	int verbose = 0, silent = 0;	char *area;	static const char fmts[] = "%s\n", fmtd[] = "%d\n";	const struct termcapstr *t;	char buf[TC_BUFSIZE];	long i;	area = buf;	if (argv == NULL || argv[1] == NULL)		return (-1);	argv++;	if (argv[0][0] == '-') {		switch (argv[0][1]) {		case 'v':			verbose = 1;			break;		case 's':			silent = 1;			break;		default:			/* stderror(ERR_NAME | ERR_TCUSAGE); */			break;		}		argv++;	}	if (!*argv || *argv[0] == '\0')		return (0);	if (strcmp(*argv, "tabs") == 0) {		(void) fprintf(el->el_outfile, fmts, EL_CAN_TAB ? "yes" : "no");		return (0);	} else if (strcmp(*argv, "meta") == 0) {		(void) fprintf(el->el_outfile, fmts, Val(T_km) ? "yes" : "no");		return (0);	} else if (strcmp(*argv, "xn") == 0) {		(void) fprintf(el->el_outfile, fmts, EL_HAS_MAGIC_MARGINS ?		    "yes" : "no");		return (0);	} else if (strcmp(*argv, "am") == 0) {		(void) fprintf(el->el_outfile, fmts, EL_HAS_AUTO_MARGINS ?		    "yes" : "no");		return (0);	} else if (strcmp(*argv, "baud") == 0) {#ifdef notdef		int i;		for (i = 0; baud_rate[i].b_name != NULL; i++)			if (el->el_tty.t_speed == baud_rate[i].b_rate) {				(void) fprintf(el->el_outfile, fmts,				    baud_rate[i].b_name);				return (0);			}		(void) fprintf(el->el_outfile, fmtd, 0);#else		(void) fprintf(el->el_outfile, fmtd, (int) el->el_tty.t_speed);#endif		return (0);	} else if (strcmp(*argv, "rows") == 0 || strcmp(*argv, "lines") == 0) {		(void) fprintf(el->el_outfile, fmtd, Val(T_li));		return (0);	} else if (strcmp(*argv, "cols") == 0) {		(void) fprintf(el->el_outfile, fmtd, Val(T_co));		return (0);	}	/*         * Try to use our local definition first         */	scap = NULL;	for (t = tstr; t->name != NULL; t++)		if (strcmp(t->name, *argv) == 0) {			scap = el->el_term.t_str[t - tstr];			break;		}	if (t->name == NULL)		scap = tgetstr((char *)argv, &area);	if (!scap || scap[0] == '\0') {		if (!silent)			(void) fprintf(el->el_errfile,			    "echotc: Termcap parameter `%s' not found.\n",			    *argv);		return (-1);	}	/*         * Count home many values we need for this capability.         */	for (cap = scap, arg_need = 0; *cap; cap++)		if (*cap == '%')			switch (*++cap) {			case 'd':			case '2':			case '3':			case '.':			case '+':				arg_need++;				break;			case '%':			case '>':			case 'i':			case 'r':			case 'n':			case 'B':			case 'D':				break;			default:				/*				 * hpux has lot's of them...				 */				if (verbose)					(void) fprintf(el->el_errfile,				"echotc: Warning: unknown termcap %% `%c'.\n",					    *cap);				/* This is bad, but I won't complain */				break;			}	switch (arg_need) {	case 0:		argv++;		if (*argv && *argv[0]) {			if (!silent)				(void) fprintf(el->el_errfile,				    "echotc: Warning: Extra argument `%s'.\n",				    *argv);			return (-1);		}		(void) tputs(scap, 1, term__putc);		break;	case 1:		argv++;		if (!*argv || *argv[0] == '\0') {			if (!silent)				(void) fprintf(el->el_errfile,				    "echotc: Warning: Missing argument.\n");			return (-1);		}		arg_cols = 0;		i = strtol(*argv, &ep, 10);		if (*ep != '\0' || i < 0) {			if (!silent)				(void) fprintf(el->el_errfile,				    "echotc: Bad value `%s' for rows.\n",				    *argv);			return (-1);		}		arg_rows = (int) i;		argv++;		if (*argv && *argv[0]) {			if (!silent)				(void) fprintf(el->el_errfile,				    "echotc: Warning: Extra argument `%s'.\n",				    *argv);			return (-1);		}		(void) tputs(tgoto(scap, arg_cols, arg_rows), 1, term__putc);		break;	default:		/* This is wrong, but I will ignore it... */		if (verbose)			(void) fprintf(el->el_errfile,			 "echotc: Warning: Too many required arguments (%d).\n",			    arg_need);		/* FALLTHROUGH */	case 2:		argv++;		if (!*argv || *argv[0] == '\0') {			if (!silent)				(void) fprintf(el->el_errfile,				    "echotc: Warning: Missing argument.\n");			return (-1);		}		i = strtol(*argv, &ep, 10);		if (*ep != '\0' || i < 0) {			if (!silent)				(void) fprintf(el->el_errfile,				    "echotc: Bad value `%s' for cols.\n",				    *argv);			return (-1);		}		arg_cols = (int) i;		argv++;		if (!*argv || *argv[0] == '\0') {			if (!silent)				(void) fprintf(el->el_errfile,				    "echotc: Warning: Missing argument.\n");			return (-1);		}		i = strtol(*argv, &ep, 10);		if (*ep != '\0' || i < 0) {			if (!silent)				(void) fprintf(el->el_errfile,				    "echotc: Bad value `%s' for rows.\n",				    *argv);			return (-1);		}		arg_rows = (int) i;		if (*ep != '\0') {			if (!silent)				(void) fprintf(el->el_errfile,				    "echotc: Bad value `%s'.\n", *argv);			return (-1);		}		argv++;		if (*argv && *argv[0]) {			if (!silent)				(void) fprintf(el->el_errfile,				    "echotc: Warning: Extra argument `%s'.\n",				    *argv);			return (-1);		}		(void) tputs(tgoto(scap, arg_cols, arg_rows), arg_rows,		    term__putc);		break;	}	return (0);}

⌨️ 快捷键说明

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