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

📄 ite.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
				ip->cury = min(ip->pos, ip->rows-1);				ip->pos = 0;				ip->escape = 0;				ite_movecursor(ip, sp);				clr_attr(ip, ATTR_INV);				break;			case 'y':			/* y coord first */				ip->cury = min(ip->pos, ip->rows-1);				ip->pos = 0;				ip->fpd = 0;				break;			case 'C':			/* x coord */				ip->curx = min(ip->pos, ip->cols-1);				ip->pos = 0;				ip->escape = 0;				ite_movecursor(ip, sp);				clr_attr(ip, ATTR_INV);				break;			default:	     /* Possibly a 3 digit number. */				if (c >= '0' && c <= '9' && ip->fpd < 3) {					ip->pos = ip->pos * 10 + (c - '0');					ip->fpd++;				} else {					ip->pos = 0;					ip->escape = 0;				}				break;			}			return;		case 'd':				/* attribute change */			switch (c) {			case 'B':				set_attr(ip, ATTR_INV);				break;		        case 'D':				/* XXX: we don't do anything for underline */				set_attr(ip, ATTR_UL);				break;		        case '@':				clr_attr(ip, ATTR_ALL);				break;			}			ip->escape = 0;			return;		case 's':				/* keypad control */			switch (ip->fpd) {			case 0:				ip->hold = c;				ip->fpd++;				return;			case 1:				if (c == 'A') {					switch (ip->hold) {						case '0':						clr_attr(ip, ATTR_KPAD);						break;					case '1':						set_attr(ip, ATTR_KPAD);						break;					}				}				ip->hold = 0;			}			ip->escape = 0;			return;		case 'i':			/* back tab */			if (ip->curx > TABSIZE) {				n = ip->curx - (ip->curx & (TABSIZE - 1));				ip->curx -= n;			} else				ip->curx = 0;			ite_movecursor(ip, sp);			ip->escape = 0;			return;		case '3':			/* clear all tabs */			goto ignore;		case 'K':			/* clear_eol */			ite_clrtoeol(ip, sp, ip->cury, ip->curx);			ip->escape = 0;			return;		case 'J':			/* clear_eos */			ite_clrtoeos(ip, sp);			ip->escape = 0;			return;		case 'B':			/* cursor down 1 line */			if (++ip->cury == ip->rows) {				--ip->cury;				ite_erasecursor(ip, sp);				(*sp->ite_scroll)(ip, 1, 0, 1, SCROLL_UP);				ite_clrtoeol(ip, sp, ip->cury, 0);			}			else				ite_movecursor(ip, sp);			clr_attr(ip, ATTR_INV);			ip->escape = 0;			return;		case 'C':			/* cursor forward 1 char */			ip->escape = 0;			itecheckwrap(ip, sp);			return;		case 'A':			/* cursor up 1 line */			if (ip->cury > 0) {				ip->cury--;				ite_movecursor(ip, sp);			}			ip->escape = 0;			clr_attr(ip, ATTR_INV);			return;		case 'P':			/* delete character */			ite_dchar(ip, sp);			ip->escape = 0;			return;		case 'M':			/* delete line */			ite_dline(ip, sp);			ip->escape = 0;			return;		case 'Q':			/* enter insert mode */			ip->imode = 1;			ip->escape = 0;			return;		case 'R':			/* exit insert mode */			ip->imode = 0;			ip->escape = 0;			return;		case 'L':			/* insert blank line */			ite_iline(ip, sp);			ip->escape = 0;			return;		case 'h':			/* home key */			ip->cury = ip->curx = 0;			ite_movecursor(ip, sp);			ip->escape = 0;			return;		case 'D':			/* left arrow key */			if (ip->curx > 0) {				ip->curx--;				ite_movecursor(ip, sp);			}			ip->escape = 0;			return;		case '1':			/* set tab in all rows */			goto ignore;		case ESC:			if ((ip->escape = c) == ESC)				break;			ip->fpd = 0;			goto doesc;		default:ignore:			ip->escape = 0;			return;		}	}	switch (c &= 0x7F) {	case '\n':		if (++ip->cury == ip->rows) {			--ip->cury;			ite_erasecursor(ip, sp);			(*sp->ite_scroll)(ip, 1, 0, 1, SCROLL_UP);			ite_clrtoeol(ip, sp, ip->cury, 0);		} else			ite_movecursor(ip, sp);		clr_attr(ip, ATTR_INV);		break;	case '\r':		if (ip->curx) {			ip->curx = 0;			ite_movecursor(ip, sp);		}		break;		case '\b':		if (--ip->curx < 0)			ip->curx = 0;		else			ite_movecursor(ip, sp);		break;	case '\t':		if (ip->curx < TABEND(unit)) {			n = TABSIZE - (ip->curx & (TABSIZE - 1));			ip->curx += n;			ite_movecursor(ip, sp);		} else			itecheckwrap(ip, sp);		break;	case CTRL('G'):		if (&ite_tty[unit] == kbd_tty)			kbdbell(unit);		break;	case ESC:		ip->escape = ESC;		break;	default:		if (c < ' ' || c == DEL)			break;		if (ip->imode)			ite_ichar(ip, sp);		if ((ip->attribute & ATTR_INV) || attrtest(ip, ATTR_INV)) {			attrset(ip, ATTR_INV);			(*sp->ite_putc)(ip, c, ip->cury, ip->curx, ATTR_INV);		} else			(*sp->ite_putc)(ip, c, ip->cury, ip->curx, ATTR_NOR);		ite_drawcursor(ip, sp);		itecheckwrap(ip, sp);		break;	}}itecheckwrap(ip, sp)     register struct ite_softc *ip;     register struct itesw *sp;{	if (++ip->curx == ip->cols) {		ip->curx = 0;		clr_attr(ip, ATTR_INV);		if (++ip->cury == ip->rows) {			--ip->cury;			ite_erasecursor(ip, sp);			(*sp->ite_scroll)(ip, 1, 0, 1, SCROLL_UP);			ite_clrtoeol(ip, sp, ip->cury, 0);			return;		}	}	ite_movecursor(ip, sp);}ite_dchar(ip, sp)     register struct ite_softc *ip;     register struct itesw *sp;{	if (ip->curx < ip->cols - 1) {		ite_erasecursor(ip, sp);		(*sp->ite_scroll)(ip, ip->cury, ip->curx + 1, 1, SCROLL_LEFT);		attrmov(ip, ip->cury, ip->curx + 1, ip->cury, ip->curx,			1, ip->cols - ip->curx - 1);	}	attrclr(ip, ip->cury, ip->cols - 1, 1, 1);	(*sp->ite_putc)(ip, ' ', ip->cury, ip->cols - 1, ATTR_NOR);	ite_drawcursor(ip, sp);}ite_ichar(ip, sp)     register struct ite_softc *ip;     register struct itesw *sp;{	if (ip->curx < ip->cols - 1) {		ite_erasecursor(ip, sp);		(*sp->ite_scroll)(ip, ip->cury, ip->curx, 1, SCROLL_RIGHT);		attrmov(ip, ip->cury, ip->curx, ip->cury, ip->curx + 1,			1, ip->cols - ip->curx - 1);	}	attrclr(ip, ip->cury, ip->curx, 1, 1);	(*sp->ite_putc)(ip, ' ', ip->cury, ip->curx, ATTR_NOR);	ite_drawcursor(ip, sp);}ite_dline(ip, sp)     register struct ite_softc *ip;     register struct itesw *sp;{	if (ip->cury < ip->rows - 1) {		ite_erasecursor(ip, sp);		(*sp->ite_scroll)(ip, ip->cury + 1, 0, 1, SCROLL_UP);		attrmov(ip, ip->cury + 1, 0, ip->cury, 0,			ip->rows - ip->cury - 1, ip->cols);	}	ite_clrtoeol(ip, sp, ip->rows - 1, 0);}ite_iline(ip, sp)     register struct ite_softc *ip;     register struct itesw *sp;{	if (ip->cury < ip->rows - 1) {		ite_erasecursor(ip, sp);		(*sp->ite_scroll)(ip, ip->cury, 0, 1, SCROLL_DOWN);		attrmov(ip, ip->cury, 0, ip->cury + 1, 0,			ip->rows - ip->cury - 1, ip->cols);	}	ite_clrtoeol(ip, sp, ip->cury, 0);}ite_clrtoeol(ip, sp, y, x)     register struct ite_softc *ip;     register struct itesw *sp;     register int y, x;{	(*sp->ite_clear)(ip, y, x, 1, ip->cols - x);	attrclr(ip, y, x, 1, ip->cols - x);	ite_drawcursor(ip, sp);}ite_clrtoeos(ip, sp)     register struct ite_softc *ip;     register struct itesw *sp;{	(*sp->ite_clear)(ip, ip->cury, 0, ip->rows - ip->cury, ip->cols);	attrclr(ip, ip->cury, 0, ip->rows - ip->cury, ip->cols);	ite_drawcursor(ip, sp);}/* * Console functions */#include <hp/dev/cons.h>#ifdef hp300#include <hp/dev/grfreg.h>#endif#ifdef DEBUG/* * Minimum ITE number at which to start looking for a console. * Setting to 0 will do normal search, 1 will skip first ITE device, * NITE will skip ITEs and use serial port. */int	whichconsole = 0;#endifitecnprobe(cp)	struct consdev *cp;{	register struct ite_softc *ip;	int i, sw, maj, unit, pri;	/* locate the major number */	for (maj = 0; maj < nchrdev; maj++)		if (cdevsw[maj].d_open == iteopen)			break;	/* urk! */	grfconfig();	/* check all the individual displays and find the best */	unit = -1;	pri = CN_DEAD;	for (i = 0; i < NITE; i++) {		struct grf_softc *gp = &grf_softc[i];		ip = &ite_softc[i];		if ((gp->g_flags & GF_ALIVE) == 0)			continue;		ip->flags = (ITE_ALIVE|ITE_CONSOLE);		/* locate the proper switch table. */		for (sw = 0; sw < nitesw; sw++)			if (itesw[sw].ite_hwid == gp->g_sw->gd_hwid)				break;		if (sw == nitesw)			continue;#ifdef DEBUG		if (i < whichconsole)			continue;#endif		ip->isw = &itesw[sw];		ip->grf = gp;#ifdef hp300		if ((int)gp->g_display.gd_regaddr == GRFIADDR) {			pri = CN_INTERNAL;			unit = i;		} else if (unit < 0) {			pri = CN_NORMAL;			unit = i;		}#endif#ifdef hp800		/* XXX use the first one for now */		if (unit < 0) {			pri = CN_INTERNAL;			unit = i;		}#endif	}	/* initialize required fields */	cp->cn_dev = makedev(maj, unit);	cp->cn_tp = &ite_tty[unit];	cp->cn_pri = pri;}itecninit(cp)	struct consdev *cp;{	int unit = UNIT(cp->cn_dev);	struct ite_softc *ip = &ite_softc[unit];	ip->attrbuf = console_attributes;	iteinit(cp->cn_dev);	ip->flags |= (ITE_ACTIVE|ITE_ISCONS);	kbd_tty = &ite_tty[unit];}/*ARGSUSED*/itecngetc(dev)	dev_t dev;{	register int c;	int stat;	c = kbdgetc(0, &stat);	/* XXX always read from keyboard 0 for now */	switch ((stat >> KBD_SSHIFT) & KBD_SMASK) {	case KBD_SHIFT:		c = kbd_shiftmap[c & KBD_CHARMASK];		break;	case KBD_CTRL:		c = kbd_ctrlmap[c & KBD_CHARMASK];		break;	case KBD_KEY:		c = kbd_keymap[c & KBD_CHARMASK];		break;	default:		c = 0;		break;	}	return(c);}itecnputc(dev, c)	dev_t dev;	int c;{	static int paniced = 0;	struct ite_softc *ip = &ite_softc[UNIT(dev)];	if (panicstr && !paniced &&	    (ip->flags & (ITE_ACTIVE|ITE_INGRF)) != ITE_ACTIVE) {		(void) iteon(dev, 3);		paniced = 1;	}	iteputchar(c, dev);}#endif

⌨️ 快捷键说明

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