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

📄 tty.c

📁 asterisk 是一个很有知名度开源软件
💻 C
📖 第 1 页 / 共 2 页
字号:
 *	Get the tty characters */private voidtty__getchar(struct termios *td, unsigned char *s){#ifdef VINTR	s[C_INTR] = td->c_cc[VINTR];#endif /* VINTR */#ifdef VQUIT	s[C_QUIT] = td->c_cc[VQUIT];#endif /* VQUIT */#ifdef VERASE	s[C_ERASE] = td->c_cc[VERASE];#endif /* VERASE */#ifdef VKILL	s[C_KILL] = td->c_cc[VKILL];#endif /* VKILL */#ifdef VEOF	s[C_EOF] = td->c_cc[VEOF];#endif /* VEOF */#ifdef VEOL	s[C_EOL] = td->c_cc[VEOL];#endif /* VEOL */#ifdef VEOL2	s[C_EOL2] = td->c_cc[VEOL2];#endif /* VEOL2 */#ifdef VSWTCH	s[C_SWTCH] = td->c_cc[VSWTCH];#endif /* VSWTCH */#ifdef VDSWTCH	s[C_DSWTCH] = td->c_cc[VDSWTCH];#endif /* VDSWTCH */#ifdef VERASE2	s[C_ERASE2] = td->c_cc[VERASE2];#endif /* VERASE2 */#ifdef VSTART	s[C_START] = td->c_cc[VSTART];#endif /* VSTART */#ifdef VSTOP	s[C_STOP] = td->c_cc[VSTOP];#endif /* VSTOP */#ifdef VWERASE	s[C_WERASE] = td->c_cc[VWERASE];#endif /* VWERASE */#ifdef VSUSP	s[C_SUSP] = td->c_cc[VSUSP];#endif /* VSUSP */#ifdef VDSUSP	s[C_DSUSP] = td->c_cc[VDSUSP];#endif /* VDSUSP */#ifdef VREPRINT	s[C_REPRINT] = td->c_cc[VREPRINT];#endif /* VREPRINT */#ifdef VDISCARD	s[C_DISCARD] = td->c_cc[VDISCARD];#endif /* VDISCARD */#ifdef VLNEXT	s[C_LNEXT] = td->c_cc[VLNEXT];#endif /* VLNEXT */#ifdef VSTATUS	s[C_STATUS] = td->c_cc[VSTATUS];#endif /* VSTATUS */#ifdef VPAGE	s[C_PAGE] = td->c_cc[VPAGE];#endif /* VPAGE */#ifdef VPGOFF	s[C_PGOFF] = td->c_cc[VPGOFF];#endif /* VPGOFF */#ifdef VKILL2	s[C_KILL2] = td->c_cc[VKILL2];#endif /* KILL2 */#ifdef VMIN	s[C_MIN] = td->c_cc[VMIN];#endif /* VMIN */#ifdef VTIME	s[C_TIME] = td->c_cc[VTIME];#endif /* VTIME */}				/* tty__getchar *//* tty__setchar(): *	Set the tty characters */private voidtty__setchar(struct termios *td, unsigned char *s){#ifdef VINTR	td->c_cc[VINTR] = s[C_INTR];#endif /* VINTR */#ifdef VQUIT	td->c_cc[VQUIT] = s[C_QUIT];#endif /* VQUIT */#ifdef VERASE	td->c_cc[VERASE] = s[C_ERASE];#endif /* VERASE */#ifdef VKILL	td->c_cc[VKILL] = s[C_KILL];#endif /* VKILL */#ifdef VEOF	td->c_cc[VEOF] = s[C_EOF];#endif /* VEOF */#ifdef VEOL	td->c_cc[VEOL] = s[C_EOL];#endif /* VEOL */#ifdef VEOL2	td->c_cc[VEOL2] = s[C_EOL2];#endif /* VEOL2 */#ifdef VSWTCH	td->c_cc[VSWTCH] = s[C_SWTCH];#endif /* VSWTCH */#ifdef VDSWTCH	td->c_cc[VDSWTCH] = s[C_DSWTCH];#endif /* VDSWTCH */#ifdef VERASE2	td->c_cc[VERASE2] = s[C_ERASE2];#endif /* VERASE2 */#ifdef VSTART	td->c_cc[VSTART] = s[C_START];#endif /* VSTART */#ifdef VSTOP	td->c_cc[VSTOP] = s[C_STOP];#endif /* VSTOP */#ifdef VWERASE	td->c_cc[VWERASE] = s[C_WERASE];#endif /* VWERASE */#ifdef VSUSP	td->c_cc[VSUSP] = s[C_SUSP];#endif /* VSUSP */#ifdef VDSUSP	td->c_cc[VDSUSP] = s[C_DSUSP];#endif /* VDSUSP */#ifdef VREPRINT	td->c_cc[VREPRINT] = s[C_REPRINT];#endif /* VREPRINT */#ifdef VDISCARD	td->c_cc[VDISCARD] = s[C_DISCARD];#endif /* VDISCARD */#ifdef VLNEXT	td->c_cc[VLNEXT] = s[C_LNEXT];#endif /* VLNEXT */#ifdef VSTATUS	td->c_cc[VSTATUS] = s[C_STATUS];#endif /* VSTATUS */#ifdef VPAGE	td->c_cc[VPAGE] = s[C_PAGE];#endif /* VPAGE */#ifdef VPGOFF	td->c_cc[VPGOFF] = s[C_PGOFF];#endif /* VPGOFF */#ifdef VKILL2	td->c_cc[VKILL2] = s[C_KILL2];#endif /* VKILL2 */#ifdef VMIN	td->c_cc[VMIN] = s[C_MIN];#endif /* VMIN */#ifdef VTIME	td->c_cc[VTIME] = s[C_TIME];#endif /* VTIME */}				/* tty__setchar *//* tty_bind_char(): *	Rebind the editline functions */protected voidtty_bind_char(EditLine *el, int force){	unsigned char *t_n = el->el_tty.t_c[ED_IO];	unsigned char *t_o = el->el_tty.t_ed.c_cc;	unsigned char new[2], old[2];	const ttymap_t *tp;	el_action_t *map, *alt;	const el_action_t *dmap, *dalt;	new[1] = old[1] = '\0';	map = el->el_map.key;	alt = el->el_map.alt;	if (el->el_map.type == MAP_VI) {		dmap = el->el_map.vii;		dalt = el->el_map.vic;	} else {		dmap = el->el_map.emacs;		dalt = NULL;	}	for (tp = tty_map; tp->nch != -1; tp++) {		new[0] = t_n[tp->nch];		old[0] = t_o[tp->och];		if (new[0] == old[0] && !force)			continue;		/* Put the old default binding back, and set the new binding */		key_clear(el, map, (char *)old);		map[old[0]] = dmap[old[0]];		key_clear(el, map, (char *)new);		/* MAP_VI == 1, MAP_EMACS == 0... */		map[new[0]] = tp->bind[el->el_map.type];		if (dalt) {			key_clear(el, alt, (char *)old);			alt[old[0]] = dalt[old[0]];			key_clear(el, alt, (char *)new);			alt[new[0]] = tp->bind[el->el_map.type + 1];		}	}}/* tty_rawmode(): * 	Set terminal into 1 character at a time mode. */protected inttty_rawmode(EditLine *el){	if (el->el_tty.t_mode == ED_IO || el->el_tty.t_mode == QU_IO)		return (0);	if (el->el_flags & EDIT_DISABLED)		return (0);	if (tty_getty(el, &el->el_tty.t_ts) == -1) {#ifdef DEBUG_TTY		(void) fprintf(el->el_errfile, "tty_rawmode: tty_getty: %s\n",		    strerror(errno));#endif /* DEBUG_TTY */		return (-1);	}	/*         * We always keep up with the eight bit setting and the speed of the         * tty. But only we only believe changes that are made to cooked mode!         */	el->el_tty.t_eight = tty__geteightbit(&el->el_tty.t_ts);	el->el_tty.t_speed = tty__getspeed(&el->el_tty.t_ts);	if (tty__getspeed(&el->el_tty.t_ex) != el->el_tty.t_speed ||	    tty__getspeed(&el->el_tty.t_ed) != el->el_tty.t_speed) {		(void) cfsetispeed(&el->el_tty.t_ex, el->el_tty.t_speed);		(void) cfsetospeed(&el->el_tty.t_ex, el->el_tty.t_speed);		(void) cfsetispeed(&el->el_tty.t_ed, el->el_tty.t_speed);		(void) cfsetospeed(&el->el_tty.t_ed, el->el_tty.t_speed);	}	if (tty__cooked_mode(&el->el_tty.t_ts)) {		if (el->el_tty.t_ts.c_cflag != el->el_tty.t_ex.c_cflag) {			el->el_tty.t_ex.c_cflag =			    el->el_tty.t_ts.c_cflag;			el->el_tty.t_ex.c_cflag &=			    ~el->el_tty.t_t[EX_IO][MD_CTL].t_clrmask;			el->el_tty.t_ex.c_cflag |=			    el->el_tty.t_t[EX_IO][MD_CTL].t_setmask;			el->el_tty.t_ed.c_cflag =			    el->el_tty.t_ts.c_cflag;			el->el_tty.t_ed.c_cflag &=			    ~el->el_tty.t_t[ED_IO][MD_CTL].t_clrmask;			el->el_tty.t_ed.c_cflag |=			    el->el_tty.t_t[ED_IO][MD_CTL].t_setmask;		}		if ((el->el_tty.t_ts.c_lflag != el->el_tty.t_ex.c_lflag) &&		    (el->el_tty.t_ts.c_lflag != el->el_tty.t_ed.c_lflag)) {			el->el_tty.t_ex.c_lflag =			    el->el_tty.t_ts.c_lflag;			el->el_tty.t_ex.c_lflag &=			    ~el->el_tty.t_t[EX_IO][MD_LIN].t_clrmask;			el->el_tty.t_ex.c_lflag |=			    el->el_tty.t_t[EX_IO][MD_LIN].t_setmask;			el->el_tty.t_ed.c_lflag =			    el->el_tty.t_ts.c_lflag;			el->el_tty.t_ed.c_lflag &=			    ~el->el_tty.t_t[ED_IO][MD_LIN].t_clrmask;			el->el_tty.t_ed.c_lflag |=			    el->el_tty.t_t[ED_IO][MD_LIN].t_setmask;		}		if ((el->el_tty.t_ts.c_iflag != el->el_tty.t_ex.c_iflag) &&		    (el->el_tty.t_ts.c_iflag != el->el_tty.t_ed.c_iflag)) {			el->el_tty.t_ex.c_iflag =			    el->el_tty.t_ts.c_iflag;			el->el_tty.t_ex.c_iflag &=			    ~el->el_tty.t_t[EX_IO][MD_INP].t_clrmask;			el->el_tty.t_ex.c_iflag |=			    el->el_tty.t_t[EX_IO][MD_INP].t_setmask;			el->el_tty.t_ed.c_iflag =			    el->el_tty.t_ts.c_iflag;			el->el_tty.t_ed.c_iflag &=			    ~el->el_tty.t_t[ED_IO][MD_INP].t_clrmask;			el->el_tty.t_ed.c_iflag |=			    el->el_tty.t_t[ED_IO][MD_INP].t_setmask;		}		if ((el->el_tty.t_ts.c_oflag != el->el_tty.t_ex.c_oflag) &&		    (el->el_tty.t_ts.c_oflag != el->el_tty.t_ed.c_oflag)) {			el->el_tty.t_ex.c_oflag =			    el->el_tty.t_ts.c_oflag;			el->el_tty.t_ex.c_oflag &=			    ~el->el_tty.t_t[EX_IO][MD_OUT].t_clrmask;			el->el_tty.t_ex.c_oflag |=			    el->el_tty.t_t[EX_IO][MD_OUT].t_setmask;			el->el_tty.t_ed.c_oflag =			    el->el_tty.t_ts.c_oflag;			el->el_tty.t_ed.c_oflag &=			    ~el->el_tty.t_t[ED_IO][MD_OUT].t_clrmask;			el->el_tty.t_ed.c_oflag |=			    el->el_tty.t_t[ED_IO][MD_OUT].t_setmask;		}		if (tty__gettabs(&el->el_tty.t_ex) == 0)			el->el_tty.t_tabs = 0;		else			el->el_tty.t_tabs = EL_CAN_TAB ? 1 : 0;		{			int i;			tty__getchar(&el->el_tty.t_ts, el->el_tty.t_c[TS_IO]);			/*		         * Check if the user made any changes.		         * If he did, then propagate the changes to the		         * edit and execute data structures.		         */			for (i = 0; i < C_NCC; i++)				if (el->el_tty.t_c[TS_IO][i] !=				    el->el_tty.t_c[EX_IO][i])					break;			if (i != C_NCC) {				/*				 * Propagate changes only to the unprotected				 * chars that have been modified just now.				 */				for (i = 0; i < C_NCC; i++) {					if (!((el->el_tty.t_t[ED_IO][MD_CHAR].t_setmask & C_SH(i)))					    && (el->el_tty.t_c[TS_IO][i] != el->el_tty.t_c[EX_IO][i]))						el->el_tty.t_c[ED_IO][i] = el->el_tty.t_c[TS_IO][i];					if (el->el_tty.t_t[ED_IO][MD_CHAR].t_clrmask & C_SH(i))						el->el_tty.t_c[ED_IO][i] = el->el_tty.t_vdisable;				}				tty_bind_char(el, 0);				tty__setchar(&el->el_tty.t_ed, el->el_tty.t_c[ED_IO]);				for (i = 0; i < C_NCC; i++) {					if (!((el->el_tty.t_t[EX_IO][MD_CHAR].t_setmask & C_SH(i)))					    && (el->el_tty.t_c[TS_IO][i] != el->el_tty.t_c[EX_IO][i]))						el->el_tty.t_c[EX_IO][i] = el->el_tty.t_c[TS_IO][i];					if (el->el_tty.t_t[EX_IO][MD_CHAR].t_clrmask & C_SH(i))						el->el_tty.t_c[EX_IO][i] = el->el_tty.t_vdisable;				}				tty__setchar(&el->el_tty.t_ex, el->el_tty.t_c[EX_IO]);			}		}	}	if (tty_setty(el, &el->el_tty.t_ed) == -1) {#ifdef DEBUG_TTY		(void) fprintf(el->el_errfile, "tty_rawmode: tty_setty: %s\n",		    strerror(errno));#endif /* DEBUG_TTY */		return (-1);	}	el->el_tty.t_mode = ED_IO;	return (0);}/* tty_cookedmode(): *	Set the tty back to normal mode */protected inttty_cookedmode(EditLine *el){				/* set tty in normal setup */	if (el->el_tty.t_mode == EX_IO)		return (0);	if (el->el_flags & EDIT_DISABLED)		return (0);	if (tty_setty(el, &el->el_tty.t_ex) == -1) {#ifdef DEBUG_TTY		(void) fprintf(el->el_errfile,		    "tty_cookedmode: tty_setty: %s\n",		    strerror(errno));#endif /* DEBUG_TTY */		return (-1);	}	el->el_tty.t_mode = EX_IO;	return (0);}/* tty_quotemode(): *	Turn on quote mode */protected inttty_quotemode(EditLine *el){	if (el->el_tty.t_mode == QU_IO)		return (0);	el->el_tty.t_qu = el->el_tty.t_ed;	el->el_tty.t_qu.c_iflag &= ~el->el_tty.t_t[QU_IO][MD_INP].t_clrmask;	el->el_tty.t_qu.c_iflag |= el->el_tty.t_t[QU_IO][MD_INP].t_setmask;	el->el_tty.t_qu.c_oflag &= ~el->el_tty.t_t[QU_IO][MD_OUT].t_clrmask;	el->el_tty.t_qu.c_oflag |= el->el_tty.t_t[QU_IO][MD_OUT].t_setmask;	el->el_tty.t_qu.c_cflag &= ~el->el_tty.t_t[QU_IO][MD_CTL].t_clrmask;	el->el_tty.t_qu.c_cflag |= el->el_tty.t_t[QU_IO][MD_CTL].t_setmask;	el->el_tty.t_qu.c_lflag &= ~el->el_tty.t_t[QU_IO][MD_LIN].t_clrmask;	el->el_tty.t_qu.c_lflag |= el->el_tty.t_t[QU_IO][MD_LIN].t_setmask;	if (tty_setty(el, &el->el_tty.t_qu) == -1) {#ifdef DEBUG_TTY		(void) fprintf(el->el_errfile, "QuoteModeOn: tty_setty: %s\n",		    strerror(errno));#endif /* DEBUG_TTY */		return (-1);	}	el->el_tty.t_mode = QU_IO;	return (0);}/* tty_noquotemode(): *	Turn off quote mode */protected inttty_noquotemode(EditLine *el){	if (el->el_tty.t_mode != QU_IO)		return (0);	if (tty_setty(el, &el->el_tty.t_ed) == -1) {#ifdef DEBUG_TTY		(void) fprintf(el->el_errfile, "QuoteModeOff: tty_setty: %s\n",		    strerror(errno));#endif /* DEBUG_TTY */		return (-1);	}	el->el_tty.t_mode = ED_IO;	return (0);}/* tty_stty(): *	Stty builtin */protected int/*ARGSUSED*/tty_stty(EditLine *el, int argc, const char **argv){	const ttymodes_t *m;	char x;	int aflag = 0;	const char *s, *d;	const char *name;	int z = EX_IO;	if (argv == NULL)		return (-1);	name = *argv++;	while (argv && *argv && argv[0][0] == '-' && argv[0][2] == '\0')		switch (argv[0][1]) {		case 'a':			aflag++;			argv++;			break;		case 'd':			argv++;			z = ED_IO;			break;		case 'x':			argv++;			z = EX_IO;			break;		case 'q':			argv++;			z = QU_IO;			break;		default:			(void) fprintf(el->el_errfile,			    "%s: Unknown switch `%c'.\n",			    name, argv[0][1]);			return (-1);		}	if (!argv || !*argv) {		int i = -1;		int len = 0, st = 0, cu;		for (m = ttymodes; m->m_name; m++) {			if (m->m_type != i) {				(void) fprintf(el->el_outfile, "%s%s",				    i != -1 ? "\n" : "",				    el->el_tty.t_t[z][m->m_type].t_name);				i = m->m_type;				st = len =				    strlen(el->el_tty.t_t[z][m->m_type].t_name);			}			x = (el->el_tty.t_t[z][i].t_setmask & m->m_value)			    ?  '+' : '\0';			x = (el->el_tty.t_t[z][i].t_clrmask & m->m_value)			    ? '-' : x;			if (x != '\0' || aflag) {				cu = strlen(m->m_name) + (x != '\0') + 1;				if (len + cu >= el->el_term.t_size.h) {					(void) fprintf(el->el_outfile, "\n%*s",					    st, "");					len = st + cu;				} else					len += cu;				if (x != '\0')					(void) fprintf(el->el_outfile, "%c%s ",					    x, m->m_name);				else					(void) fprintf(el->el_outfile, "%s ",					    m->m_name);			}		}		(void) fprintf(el->el_outfile, "\n");		return (0);	}	while (argv && (s = *argv++)) {		switch (*s) {		case '+':		case '-':			x = *s++;			break;		default:			x = '\0';			break;		}		d = s;		for (m = ttymodes; m->m_name; m++)			if (strcmp(m->m_name, d) == 0)				break;		if (!m->m_name) {			(void) fprintf(el->el_errfile,			    "%s: Invalid argument `%s'.\n", name, d);			return (-1);		}		switch (x) {		case '+':			el->el_tty.t_t[z][m->m_type].t_setmask |= m->m_value;			el->el_tty.t_t[z][m->m_type].t_clrmask &= ~m->m_value;			break;		case '-':			el->el_tty.t_t[z][m->m_type].t_setmask &= ~m->m_value;			el->el_tty.t_t[z][m->m_type].t_clrmask |= m->m_value;			break;		default:			el->el_tty.t_t[z][m->m_type].t_setmask &= ~m->m_value;			el->el_tty.t_t[z][m->m_type].t_clrmask &= ~m->m_value;			break;		}	}	return (0);}#ifdef notyet/* tty_printchar(): *	DEbugging routine to print the tty characters */private voidtty_printchar(EditLine *el, unsigned char *s){	ttyperm_t *m;	int i;	for (i = 0; i < C_NCC; i++) {		for (m = el->el_tty.t_t; m->m_name; m++)			if (m->m_type == MD_CHAR && C_SH(i) == m->m_value)				break;		if (m->m_name)			(void) fprintf(el->el_errfile, "%s ^%c ",			    m->m_name, s[i] + 'A' - 1);		if (i % 5 == 0)			(void) fprintf(el->el_errfile, "\n");	}	(void) fprintf(el->el_errfile, "\n");}#endif /* notyet */

⌨️ 快捷键说明

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