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

📄 ll_newtty.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
/*	Copyright (c) 1984 AT&T	*//*	  All Rights Reserved  	*//*	THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T	*//*	The copyright notice above does not evidence any   	*//*	actual or intended publication of such source code.	*/#ifndef lintstatic	char sccsid[] = "@(#)ll_newtty.c 1.1 92/07/30 SMI"; /* from S5R3 1.5.1.1 */#endif#include "curses.ext"static isfilter = 0;extern char *malloc(), *calloc();char *_c_why_not = NULL;static char *_stupid = "Sorry, I don't know how to deal with your '%s' terminal.\r\n";static char *_unknown = "Sorry, I need to know a more specific terminal type than '%s'.\r\n";static char *_noterminal = "Sorry, I don't know anything about your '%s' terminal.\r\n";static char *_nodatabase = "Sorry, I can't find /usr/lib/terminfo.\r\n";static char *_bad_malloc = "malloc returned NULL in _new_tty\n";SCREEN *_new_tty(type, fd)char	*type;FILE	*fd;{	int retcode;	struct map *_init_keypad();#ifdef DEBUG	if(outf) fprintf(outf, "_new_tty: type %s, fd %x\n", type, fd);#endif	/*	 * Allocate an SP structure if there is none, or if SP is	 * still pointing to an old structure from a previous call	 * to this routine.  But don't allocate one if we are being	 * called from a higher level curses routine.  Since it's our	 * job to initialize the phys_scr field and higher level routines	 * aren't supposed to, we check that field to figure which to do.	 */	if (SP == NULL || SP->cur_body!=0)		/* must use calloc here */		SP = (struct screen *) calloc(1, sizeof (struct screen));	if (SP == NULL) {		_c_why_not = _bad_malloc;		return NULL;	}	SP->term_file = fd;	if (type == 0)		type = "unknown";	_setbuffered(fd);	(void) setupterm(type, fileno(fd), &retcode);	savetty();	/* as a "useful default" - hanging up is nasty. */	/*	 * This happens if /usr/lib/terminfo does not exist, there is	 * no such terminal type, or the file is corrupted.	 * This would be a good place to print an error message.	 */	if (retcode == 0) {		_c_why_not = _noterminal;		return NULL;	} else if (retcode < 0) {		_c_why_not = _nodatabase;		return NULL;	}	if (chk_trm() == ERR)		return NULL;	SP->tcap = cur_term;	SP->doclear = 1;	SP->cur_body = (struct line **) calloc((unsigned)(lines+2), sizeof (struct line *));	SP->std_body = (struct line **) calloc((unsigned)(lines+2), sizeof (struct line *));	if (SP->cur_body == NULL || SP->std_body == NULL) {		_c_why_not = _bad_malloc;		return NULL;	}	_init_keypad();	_init_acs();	SP->input_queue = (short *) malloc(INP_QSIZE * sizeof (short));	if (SP->input_queue == NULL) {		_c_why_not = _bad_malloc;		return NULL;	}	SP->input_queue[0] = -1;	SP->virt_x = 0;		/* X and Y coordinates of the SP->curptr */	SP->virt_y = 0;		/* between updates. */	_init_costs();	SP->cursorstate = 1;	/* assume a normal cursor */	return SP;}static intchk_trm(){#ifdef DEBUG	if(outf) fprintf(outf, "chk_trm().\n");#endif	if (generic_type) {		_c_why_not = _unknown;		return ERR;	}	if (isfilter) {		_forget();		/* Only need to move left or right on current line */		if (cursor_left || carriage_return ||		    column_address || parm_left_cursor) {			/* we can handle it */		} else {			_c_why_not = _stupid;			return ERR;		}	} else {		if (hard_copy || over_strike) {			_c_why_not = _stupid;			return ERR;		}		if (cursor_address) {			/* we can handle it */		} else		if ( (cursor_up || cursor_home)	/* some way to move up */		    && cursor_down		/* some way to move down */		    && (cursor_left || carriage_return)	/* ... move left */						/* printing chars moves right */			) {			/* we can handle it */		} else {			_c_why_not = _stupid;			return ERR;		}	}	/* some way to clear the screen */	if ( clear_screen || clr_eol || (delete_line && insert_line) )	    { /* we can handle it */ }	else	    {	    _c_why_not = _stupid;	    return ERR;	    }	return OK;}/* * The program is a filter.  This routine must be called before initscr, * otherwise initscr may fail on some terminals, and may set up the data * structures wrong.  Arrange that curses thinks there is a 1 line screen, * and does not use any terminal capabilities that assume they know what * line on the screen the cursor is on.  Also do not clear the screen. */filter(){	isfilter = 1;}static _save_lines;/* Forget how to do things that assume what line the cursor is on. */static_forget(){	clear_screen = NULL;	cursor_address = NULL;	row_address = NULL;	parm_up_cursor = NULL;	parm_down_cursor = NULL;	cursor_up = NULL;	cursor_down = NULL;	cursor_home = carriage_return;	_save_lines = lines;	lines = 1;}/* Return the true # of lines on the terminal, saved from before */int_num_lines(){	if (isfilter)		return _save_lines;	else		return lines;}

⌨️ 快捷键说明

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