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

📄 ttyansi.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
		    }		    if (do_linefeed(textsw)) {		        (void)ttysw_setopt((caddr_t)ttysw, TTYOPT_TEXT, 0);		        return (0);		    }		    break;		}		case CTRL(K):	/* explicitly NOT HANDLED       */		case '\t':	/* let textsw handle tab        */print_char:		default:		    if (!(!iscntrl(*addr))		    && *addr != '\t'		    && *addr != '\n'		    ||  ttysw->ttysw_frozen)			break;		    while ((!iscntrl(*addr)		    || *addr == '\t' ||  *addr == '\n')		    && len < len0 && !ttysw->ttysw_frozen) {			*cp++ = *addr++;			len++;			if (cp == &buf[sizeof(buf) - 1]) {			    /* spit out what we have so far */			    cp = from_pty_to_textsw(textsw, cp, buf);			    if (!cp) {			        (void)ttysw_setopt((caddr_t)ttysw, TTYOPT_TEXT, 0);			        return (0);			    }			}		    }		    len--; addr--;		    break;		}   /* switch (*addr) */	    } else {   /* if (! TTYOPT_TEXT) */		switch (*addr) {		case CTRL(G):			(void)blinkscreen();			break;		case '\b':			pos(curscol-1, cursrow);			break;		case '\t':			pos((curscol&-8)+8, cursrow);			break;		case '\n':	/* linefeed */			if (ansi_lf(ttysw, addr, (len0-len)-1) == 0)				goto ret;			break;		case CTRL(K):			pos(curscol, cursrow-1); /* 4014 */			break;		case '\f':			if ((ttysw->ttysw_opt&(1<<TTYOPT_PAGEMODE)) &&			    ttysw->ttysw_lpp > 1) {				if (ttysw_freeze(ttysw, 1))					goto ret;			}#ifdef TTYHIST			if (ttysw->ttysw_opt&(1<<TTYOPT_HISTORY))				ttyhist_write(ttysw, bottom);#endif			(void)ttysw_clear(ttysw);		case '\r':			/* pos(0,cursrow); */			curscol = 0;			break;		case CTRL([):			state |= S_ESC;			break;		case DEL:	/* ignored */			break;    		default:			if (!iscntrl(*addr)) {				int n;    				n = ansi_char(ttysw, addr, (len0-len));				addr += n;				len += n;			}		}	    }   /* if (TTYOPT_TEXT) */	}   /* switch (state) */    }   /* for (; *addr; addr++) */ret:    if (ttysw_getopt((caddr_t) ttysw, TTYOPT_TEXT)) {	cp = from_pty_to_textsw(textsw, cp, buf);	if (!cp) {	    (void)ttysw_setopt((caddr_t)ttysw, TTYOPT_TEXT, 0);	    return (0);	}    } else {	(void)drawCursor(cursrow, curscol);    }    return(len);}/* #ifndef CMDSW */voidttysw_lighten_cursor(){	(void)removeCursor();	tty_cursor |= LIGHTCURSOR;	(void)restoreCursor();}ttysw_restore_cursor(){	(void)removeCursor();	tty_cursor &= ~LIGHTCURSOR;	(void)restoreCursor();}static intansi_lf(ttysw, addr, len)	register struct ttysubwindow *ttysw;	char *addr;	register int len;{	register int lfs = scrlins;	extern int delaypainting;	if (ttysw->ttysw_lpp >= bottom) {		if (ttysw_freeze(ttysw, 1))			return (0);	}	if (cursrow < bottom-1) {		/* pos(curscol, cursrow+1); */		cursrow++;		if (ttysw->ttysw_opt&(1<<TTYOPT_PAGEMODE))			ttysw->ttysw_lpp++;		if (!scrlins) /* ...clear line */			(void)deleteChar(left, right, cursrow);	} else {		if (delaypainting)			(void)pdisplayscreen(1);		if (!scrlins) {  /* Just wrap to top of screen and clr line */			pos(curscol, 0);			(void)deleteChar(left, right, cursrow);		} else {			if (lfs == 1) {			    /* Find pending LF's and do them all now */			    register char *cp;			    register int left_end;			    for (cp = addr+1, left_end = len; left_end--; cp++) {				if (*cp == '\n')				    lfs++;				else if (*cp == '\r' || *cp >= ' ')				    continue;				else if (*cp > '\n')				    break;			    }			}			if (lfs + ttysw->ttysw_lpp > bottom)				lfs = bottom - ttysw->ttysw_lpp;#ifdef TTYHIST			if (ttysw->ttysw_opt&(1<<TTYOPT_HISTORY))				ttyhist_write(ttysw, lfs);#endif			(void)cim_scroll(lfs);			if (ttysw->ttysw_opt&(1<<TTYOPT_PAGEMODE))				ttysw->ttysw_lpp++;			if (lfs != 1) /* avoid upsetting <dcok> for nothing */				pos(curscol, cursrow+1-lfs);		}	}	return (lfs);}static intansi_char(ttysw, addr, olen)	struct ttysubwindow *ttysw;	register unsigned char *addr;	int olen;{	register int len = olen;	char buf[300];	register char *cp = &buf[0];	int curscolstart = curscol;	for (;;) {		*cp++ = *addr;		/* Update cursor position.  Inline for speed. */		if (curscol < right-1)			curscol++;		else {			/* Wrap to col 1 then pretend LF seen */			*cp = '\0';			(void)writePartialLine(buf, curscolstart);			curscol = 0;			(void) ansi_lf(ttysw, addr, len);			return (olen - len);		}		if (len > 0) {			if (!iscntrl(*(addr+1))			&& cp < &buf[sizeof (buf) - 1]) {				len--;				addr++;				continue;			} else				break; /* out of for loop */		} else			break;  /* out of for loop */	}	*cp = '\0';	(void)writePartialLine(buf, curscolstart);	return (olen - len);}/* #endif CMDSW */staticansi_escape(ttysw, c, ac, av)	struct ttysubwindow *ttysw;	register char c;	register int ac, *av;{	register int av0, i, found = TRUE;	Textsw	textsw;	if ((av0 = av[0]) <= 0)		av0 = 1;	if (!ttysw_getopt((caddr_t) ttysw, TTYOPT_TEXT)) switch (c) {	case '@':		(void)insertChar(curscol, curscol+av0, cursrow);		break;	case 'A':		pos(curscol, cursrow-av0);		break;	case 'B':		pos(curscol, cursrow+av0);		break;	case 'C':		pos(curscol+av0, cursrow);		break;	case 'D':		pos(curscol-av0, cursrow);		break;	case 'E':		pos(left, cursrow+av0);		break;	case 'f':	case 'H':		if (av[1] <= 0)			av[1] = 1;		pos(av[1]-1, av0-1);		av[1] = 1;		break;	case 'L':			(void)insert_lines(cursrow, av0);		break;	case 'M':		(void)delete_lines(cursrow, av0);		break;	case 'P':		(void)deleteChar(curscol, curscol+av0, cursrow);		break;	case 'm':		for (i = 0; i < ac; i++) {			switch (av[i]) {			case 0:				clear_mode();				break;			case 1:				bold_mode();				break;			case 4:				underscore_mode();				break;			case 7:				inverse_mode();				break;			case 2:			case 3:			case 5:			case 6:				case 8:			case 9: {				int	ttysw_getboldstyle();					int	boldstyle = ttysw_getboldstyle();							if (boldstyle & TTYSW_BOLD_NONE)					inverse_mode();				else					bold_mode();				break;				}						default:				clear_mode();				break;			}		}		break;	case 'p':		if (!fillfunc) {			(void)screencomp();			fillfunc = 1-fillfunc;		}		break;	case 'q':		if (fillfunc) {			(void)screencomp();			fillfunc = 1-fillfunc;		}		break;	case 'r':		scrlins = av0;		break;	case 's':		scrlins = 1;		(void)clear_mode();#ifdef TTYHIST		ttyhist_flush(ttysw);#endif		break;	default:		found = FALSE;		break;	} else {	    found = FALSE;	}	if (!found) switch(c) {	case 'J':		if (ttysw_getopt((caddr_t) ttysw, TTYOPT_TEXT)) {		    textsw = (Textsw)ttysw->ttysw_hist;		    if (erase_chars(textsw,		        textsw_find_mark(textsw, cmdsw->pty_mark),		        cmdsw->cmd_started ?			    textsw_find_mark(textsw, cmdsw->user_mark)			      - (Textsw_index) cmdsw->pty_owes_newline :			    (Textsw_index)			      textsw_get(textsw, TEXTSW_LENGTH)))		    {		        handle_escape_status = 1;		    }		} else {		    (void)delete_lines(cursrow+1, bottom-(cursrow+1));		    (void)deleteChar(curscol, right, cursrow);		}		break;	case 'K':	/* clear to end of line */		if (ttysw_getopt((caddr_t) ttysw, TTYOPT_TEXT)) {		    textsw = (Textsw)ttysw->ttysw_hist;		    if (erase_chars(textsw,		        textsw_find_mark(textsw, cmdsw->pty_mark),		        (Textsw_index) get_end_of_line(textsw)))		    {		        handle_escape_status = 1;		    }		} else {		    (void)deleteChar(curscol, right, cursrow);		}		break;	case 'h': {	/* set mode */		int	turn_on;				for (i = 0; i < ac; i++) {			if (av[i] > 0 &&			    (av[i] & 0xff000000) == ('>' << 24)) {			        turn_on = (((av[i] & 0x00ffffff) == TTYOPT_TEXT) ?			                  !scroll_disabled_from_menu : TRUE);			        if (!turn_on && scroll_disabled_from_menu)			            cmdsw->enable_scroll_stay_on = TRUE;				(void)ttysw_setopt((caddr_t) ttysw,				    av[i] & 0x00ffffff, turn_on);			}	    		    }	  		}		    		break;	case 'k':	/* report mode */		for (i = 0; i < ac; i++)			if (av[i] > 0 &&			    (av[i] & 0xff000000) == ('>' << 24)) {				char buf[16];				(void) sprintf(buf, "\33[>%d%c",				    av[i] & 0x00ffffff,				    ttysw_getopt((caddr_t) ttysw,				    av[i] & 0x00ffffff) ? 'h' : 'l');				(void) ttysw_input((caddr_t) ttysw,				    buf, strlen(buf));			}		break;	case 'l':	/* reset mode */		for (i = 0; i < ac; i++)			if (av[i] > 0 &&			    (av[i] & 0xff000000) == ('>' << 24))				(void)ttysw_setopt((caddr_t) ttysw,				    av[i] & 0x00ffffff, 0);		break;	default:	/* X3.64 says ignore if we don't know */		return(TTY_OK);	}	return(TTY_DONE);}/* #ifndef CMDSW */extern voidpos(col, row)	register int col, row;{	if (col >= right)		col = right - 1;	if (col < left)		col = left;	if (row >= bottom)		row = bottom - 1;	if (row < top)		row = top;	cursrow = row;	curscol = col;	(void)vpos(row, col);}/* #endif CMDSW *//* ARGSUSED */ttysw_clear(ttysw)      Ttysw *ttysw;{      pos(left, top);      (void)cim_clear(top, bottom);}

⌨️ 快捷键说明

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