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

📄 tty.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
/* tty__getchar(): *	Get the tty characters */private voidtty__getchar(td, s)    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(td, s)    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(el, force)    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;    char new[2], old[2];    ttymap_t *tp;    el_action_t  *dmap, *dalt, *map, *alt;    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, old);	map[old[0]] = dmap[old[0]];	key_clear(el, map, new);	/* MAP_VI == 1, MAP_EMACS == 0... */	map[new[0]] = tp->bind[el->el_map.type];	if (dalt) {	    key_clear(el, alt, old);	    alt[old[0]] = dalt[old[0]];	    key_clear(el, alt, 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(el)    EditLine *el;{    if (el->el_tty.t_mode == ED_IO)	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][M_CTL].t_clrmask;	    el->el_tty.t_ex.c_cflag |=  el->el_tty.t_t[EX_IO][M_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][M_CTL].t_clrmask;	    el->el_tty.t_ed.c_cflag |=  el->el_tty.t_t[ED_IO][M_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][M_LIN].t_clrmask;	    el->el_tty.t_ex.c_lflag |=  el->el_tty.t_t[EX_IO][M_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][M_LIN].t_clrmask;	    el->el_tty.t_ed.c_lflag |=  el->el_tty.t_t[ED_IO][M_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][M_INP].t_clrmask;	    el->el_tty.t_ex.c_iflag |=  el->el_tty.t_t[EX_IO][M_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][M_INP].t_clrmask;	    el->el_tty.t_ed.c_iflag |=  el->el_tty.t_t[ED_IO][M_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][M_OUT].t_clrmask;	    el->el_tty.t_ex.c_oflag |=  el->el_tty.t_t[EX_IO][M_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][M_OUT].t_clrmask;	    el->el_tty.t_ed.c_oflag |=  el->el_tty.t_t[ED_IO][M_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][M_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][M_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][M_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][M_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);} /* end tty_rawmode *//* tty_cookedmode(): *	Set the tty back to normal mode */protected inttty_cookedmode(el)    EditLine *el;{				/* set tty in normal setup */    if (el->el_tty.t_mode == EX_IO)	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);} /* end tty_cookedmode *//* tty_quotemode(): *	Turn on quote mode */protected inttty_quotemode(el)    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][M_INP].t_clrmask;    el->el_tty.t_qu.c_iflag |=  el->el_tty.t_t[QU_IO][M_INP].t_setmask;    el->el_tty.t_qu.c_oflag &= ~el->el_tty.t_t[QU_IO][M_OUT].t_clrmask;    el->el_tty.t_qu.c_oflag |=  el->el_tty.t_t[QU_IO][M_OUT].t_setmask;    el->el_tty.t_qu.c_cflag &= ~el->el_tty.t_t[QU_IO][M_CTL].t_clrmask;    el->el_tty.t_qu.c_cflag |=  el->el_tty.t_t[QU_IO][M_CTL].t_setmask;    el->el_tty.t_qu.c_lflag &= ~el->el_tty.t_t[QU_IO][M_LIN].t_clrmask;    el->el_tty.t_qu.c_lflag |=  el->el_tty.t_t[QU_IO][M_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;} /* end tty_quotemode *//* tty_noquotemode(): *	Turn off quote mode */protected inttty_noquotemode(el)    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(el, argc, argv)    EditLine *el;    int argc;    char **argv;{    ttymodes_t *m;    char x, *d;    int aflag = 0;    char *s;    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;} /* end tty_stty */#ifdef notyet/* tty_printchar(): *	DEbugging routine to print the tty characters */private voidtty_printchar(el, s)    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 == M_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 + -