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

📄 new_curse.c

📁 aee是一种易使用的文本编辑器。你可以不用说明书来使用它。它提供终端接口和本地的X-windows接口。它的特性包括即弹的菜单
💻 C
📖 第 1 页 / 共 5 页
字号:
		{ 3, "\033OD", 0404 },	/* key left	*/		{ 3, "\033OB", 0402 },	/* key down	*/		{ 4, "\033O6~", 0522 },	/* key next page	*/		{ 4, "\033O5~", 0523 },	/* key prev page	*/		{ 3, "\033O[", 0550 },	/* key end	*/		{ 3, "\033O@", 0406 },	/* key home	*/		{ 4, "\033O2~", 0513 },	/* key insert char	*/		{ 3, "\033Oy", 0410 },	/* key F0	*/		{ 3, "\033OP", 0411 },	/* key F1	*/		{ 3, "\033OQ", 0412 },	/* key F2	*/		{ 3, "\033OR", 0413 },	/* key F3	*/		{ 3, "\033OS", 0414 },	/* key F4	*/		{ 3, "\033Ot", 0415 },	/* key F5	*/		{ 3, "\033Ou", 0416 },	/* key F6	*/		{ 3, "\033Ov", 0417 },	/* key F7	*/		{ 3, "\033Ol", 0420 },	/* key F8	*/		{ 3, "\033Ow", 0421 },	/* key F9	*/		{ 3, "\033Ox", 0422 },	/* key F10	*/		{ 5, "\033O10~", 0410 },	/* key F0	*/		{ 5, "\033O11~", 0411 },	/* key F1	*/		{ 5, "\033O12~", 0412 },	/* key F2	*/		{ 5, "\033O13~", 0413 },	/* key F3	*/		{ 5, "\033O14~", 0414 },	/* key F4	*/		{ 5, "\033O15~", 0415 },	/* key F5	*/		{ 5, "\033O17~", 0416 },	/* key F6	*/		{ 5, "\033O18~", 0417 },	/* key F7	*/		{ 5, "\033O19~", 0420 },	/* key F8	*/		{ 5, "\033O20~", 0421 },	/* key F9	*/		{ 5, "\033O21~", 0422 },	/* key F10	*/		{ 5, "\033O23~", 0423 },	/* key F11	*/		{ 5, "\033O24~", 0424 },	/* key F12	*/		{ 3, "\033Oq", 0534 },	/* ka1 upper-left of keypad	*/		{ 3, "\033Os", 0535 },	/* ka3 upper-right of keypad	*/		{ 3, "\033Or", 0536 },	/* kb2 center of keypad	*/ 		{ 3, "\033Op", 0537 },	/* kc1 lower-left of keypad	*/		{ 3, "\033On", 0540 },	/* kc3 lower-right of keypad	*/		{ 0, "", 0 }	/* end	*/	};struct Parameters {	int value;	struct Parameters *next;	};int Key_vals[] = { 	0407, 0526, 0515, 0525, 0512, 0510, 0402, 0514, 0517, 0516, 0410, 0411, 	0422, 0412, 0413, 0414, 0415, 0416, 0417, 0420, 0421, 0406, 0513, 0511, 	0404, 0533, 0522, 0523, 0405, 0520, 0521, 0524, 0403, 	0534, 0535, 0536, 0537, 0540, 0541, 0542, 0543, 0544, 0545, 0546, 0547, 	0550, 0527, 0551, 0552, 0553, 0554, 0555, 0556, 0557, 0560, 0561, 0562, 	0532, 0563, 0564, 0565, 0566, 0567, 0570, 0571, 0627, 0630, 0572, 0573, 	0574, 0575, 0576, 0577, 0600, 0601, 0602, 0603, 0604, 0605, 0606, 0607, 	0610, 0611, 0612, 0613, 0614, 0615, 0616, 0617, 0620, 0621, 0622, 0623, 	0624, 0625, 0626, 0423, 0424, 0425, 0426, 0427, 0430, 0431, 	0432, 0433, 0434, 0435, 0436, 0437, 0440, 0441, 0442, 0443, 0444, 0445, 	0446, 0447, 0450, 0451, 0452, 0453, 0454, 0455, 0456, 0457, 0460, 0461, 	0462, 0463, 0464, 0465, 0466, 0467, 0470, 0471, 0472, 0473, 0474, 0475, 	0476, 0477, 0500, 0501, 0502, 0503, 0504, 0505, 0506, 0507};int attributes_set[9];static int nc_attributes = 0;	/* global attributes for new_curse to observe */#ifdef SYS5struct termio Terminal;struct termio Saved_tty;#elsestruct sgttyb Terminal;struct sgttyb Saved_tty;#endifchar *tc_;int Booleans[128];	int Numbers[128];char *String_table[1024];int *virtual_lines;static char nc_scrolling_ability = FALSE;#ifdef CAP#if defined(__STDC__) || defined(__cplusplus)#define P_(s) s#else#define P_(s) ()#endif /* __STDC__ */int tc_Get_int P_((int));void CAP_PARSE P_((void));void Find_term P_((void));#undef P_#endif /* CAP */#ifndef __STDC__#ifndef HAS_STDLIBextern char *fgets();extern char *malloc();extern char *getenv();FILE *fopen();			/* declaration for open function	*/#endif /* HAS_STDLIB */#endif /* __STDC__ */#ifdef SIGWINCH/* |	Copy the contents of one window to another. */void copy_window(origin, destination)WINDOW *origin, *destination;{	int row, column;	struct _line *orig, *dest;	orig = origin->first_line;	dest = destination->first_line;	for (row = 0; 		row < (min(origin->Num_lines, destination->Num_lines)); 			row++)	{		for (column = 0; 		    column < (min(origin->Num_cols, destination->Num_cols)); 			column++)		{			dest->row[column] = orig->row[column];			dest->attributes[column] = orig->attributes[column];		}		dest->changed = orig->changed;		dest->scroll = orig->scroll;		dest->last_char = min(orig->last_char, destination->Num_cols);		orig = orig->next_screen;		dest = dest->next_screen;	}	destination->LX = min((destination->Num_cols - 1), origin->LX);	destination->LY = min((destination->Num_lines - 1), origin->LY);	destination->Attrib = origin->Attrib;	destination->scroll_up = origin->scroll_up;	destination->scroll_down = origin->scroll_down;	destination->SCROLL_CLEAR = origin->SCROLL_CLEAR;}void reinitscr(foo)int foo; {	WINDOW *local_virt;	WINDOW *local_std;	WINDOW *local_cur;	signal(SIGWINCH, reinitscr);#ifdef TIOCGWINSZ	if (ioctl(0, TIOCGWINSZ, &ws) >= 0)	{		if (ws.ws_row == LINES && ws.ws_col == COLS) 			return;		if (ws.ws_row > 0) 			LINES = ws.ws_row;		if (ws.ws_col > 0) 			COLS = ws.ws_col;	}#endif /* TIOCGWINSZ */	local_virt = newwin(LINES, COLS, 0, 0);	local_std = newwin(LINES, COLS, 0, 0);	local_cur = newwin(LINES, COLS, 0, 0);	copy_window(virtual_scr, local_virt);	copy_window(stdscr, local_std);	copy_window(curscr, local_cur);	delwin(virtual_scr);	delwin(stdscr);	delwin(curscr);	virtual_scr = local_virt;	stdscr = local_std;	curscr = local_cur;	free(virtual_lines);	virtual_lines = (int *) malloc(LINES * (sizeof(int)));	interrupt_flag = TRUE;}#endif /* SIGWINCH */void initscr()		/* initialize terminal for operations	*/{	int value;	char *lines_string;	char *columns_string;#ifdef CAP	char *pointer;#endif /* CAP */#ifdef DIAGprintf("starting initscr \n");fflush(stdout);#endif	if (initialized)		return;#ifdef BSD_SELECT	setbuf(stdin, NULL);#endif /* BSD_SELECT */	Flip_Bytes = FALSE;	Parity = 0;	Time_Out = FALSE;	bufp = 0;	Move_It = FALSE;	Noblock = FALSE;#ifdef SYS5	value = ioctl(0, TCGETA, &Terminal);	if (Terminal.c_cflag & PARENB)	{		if (Terminal.c_cflag & PARENB)			Parity = 1;		else			Parity = 2;	}	if ((Terminal.c_cflag & CS8) == CS8)	{		Num_bits = 8;	}	else if ((Terminal.c_cflag & CS7) == CS7)		Num_bits = 7;	else if ((Terminal.c_cflag & CS6) == CS6)		Num_bits = 6;	else		Num_bits = 5;	value = Terminal.c_cflag & 037;	switch (value) {	case 01:	speed = 50.0;		break;	case 02:	speed = 75.0;		break;	case 03:	speed = 110.0;		break;	case 04:	speed = 134.5;		break;	case 05:	speed = 150.0;		break;	case 06:	speed = 200.0;		break;	case 07:	speed = 300.0;		break;	case 010:	speed = 600.0;		break;	case 011:	speed = 900.0;		break;	case 012:	speed = 1200.0;		break;	case 013:	speed = 1800.0;		break;	case 014:	speed = 2400.0;		break;	case 015:	speed = 3600.0;		break;	case 016:	speed = 4800.0;		break;	case 017:	speed = 7200.0;		break;	case 020:	speed = 9600.0;		break;	case 021:	speed = 19200.0;		break;	case 022:	speed = 38400.0;		break;	default:	speed = 0.0;	}#else	value = ioctl(0, TIOCGETP, &Terminal);	if (Terminal.sg_flags & EVENP)		Parity = 2;	else if (Terminal.sg_flags & ODDP)		Parity = 1;	value = Terminal.sg_ospeed;	switch (value) {	case 01:	speed = 50.0;		break;	case 02:	speed = 75.0;		break;	case 03:	speed = 110.0;		break;	case 04:	speed = 134.5;		break;	case 05:	speed = 150.0;		break;	case 06:	speed = 200.0;		break;	case 07:	speed = 300.0;		break;	case 010:	speed = 600.0;		break;	case 011:	speed = 1200.0;		break;	case 012:	speed = 1800.0;		break;	case 013:	speed = 2400.0;		break;	case 014:	speed = 4800.0;		break;	case 015:	speed = 9600.0;		break;	default:	speed = 0.0;	}#endif	chars_per_millisecond = (0.001 * speed) / 8.0;	TERMINAL_TYPE = getenv("TERM");	if (TERMINAL_TYPE == NULL)	{		printf("unknown terminal type\n");		exit(0);	}#ifndef CAP	Fildes = -1;	TERM_PATH = getenv("TERMINFO");	if (TERM_PATH != NULL)	{		Data_Line_len = 23 + strlen(TERM_PATH) + strlen(TERMINAL_TYPE);		Term_File_name = malloc(Data_Line_len);		sprintf(Term_File_name, "%s/%c/%s", TERM_PATH, *TERMINAL_TYPE, TERMINAL_TYPE);		Fildes = open(Term_File_name, O_RDONLY);	}	if (Fildes == -1)	{		TERM_PATH = "/usr/lib/terminfo";		Data_Line_len = 23 + strlen(TERM_PATH) + strlen(TERMINAL_TYPE);		Term_File_name = malloc(Data_Line_len);		sprintf(Term_File_name, "%s/%c/%s", TERM_PATH, *TERMINAL_TYPE, TERMINAL_TYPE);		Fildes = open(Term_File_name, O_RDONLY);	}	if (Fildes == -1)	{		TERM_PATH = "/usr/share/lib/terminfo";		Data_Line_len = 23 + strlen(TERM_PATH) + strlen(TERMINAL_TYPE);		Term_File_name = malloc(Data_Line_len);		sprintf(Term_File_name, "%s/%c/%s", TERM_PATH, *TERMINAL_TYPE, TERMINAL_TYPE);		Fildes = open(Term_File_name, O_RDONLY);	}	if (Fildes == -1)	{		TERM_PATH = "/usr/share/terminfo";		Data_Line_len = 23 + strlen(TERM_PATH) + strlen(TERMINAL_TYPE);		Term_File_name = malloc(Data_Line_len);		sprintf(Term_File_name, "%s/%c/%s", TERM_PATH, *TERMINAL_TYPE, TERMINAL_TYPE);		Fildes = open(Term_File_name, O_RDONLY);	}	if (Fildes == -1)	{		free(Term_File_name);		Term_File_name = NULL;	}	else		TERM_INFO = INFO_PARSE();#else	/*	 |	termcap information can be in the TERMCAP env variable, if so 	 |	use that, otherwise check the /etc/termcap file	 */	if ((pointer = Term_File_name = getenv("TERMCAP")) != NULL)	{		if (*Term_File_name != '/')			Term_File_name = "/etc/termcap";	}	else	{		Term_File_name = "/etc/termcap";	}	if ((TFP = fopen(Term_File_name, "r")) == NULL)	{		printf("unable to open /etc/termcap file \n");		exit(0);	} 	for (value = 0; value < 1024; value++)			String_table[value] = NULL;	for (value = 0; value < 128; value++)			Booleans[value] = 0;	for (value = 0; value < 128; value++)			Numbers[value] = 0;	Data_Line = malloc(512);	if (pointer && *pointer != '/')	{		TERM_data_ptr = pointer;		CAP_PARSE();	}	else	{		Find_term();		CAP_PARSE();	}#endif	if (String_table[pc__] == NULL) 		String_table[pc__] = "\0";	if ((String_table[cm__] == NULL) || (Booleans[hc__]))	{		fprintf(stderr, "sorry, unable to use this terminal type for screen editing\n");		exit(0);	}	Key_Get();	keys_vt100();	LINES = Numbers[li__];	COLS = Numbers[co__];	if ((lines_string = getenv("LINES")) != NULL)	{		value = atoi(lines_string);		if (value > 0)			LINES = value;	}	if ((columns_string = getenv("COLUMNS")) != NULL)	{		value = atoi(columns_string);		if (value > 0)			COLS = value;	}#ifdef TIOCGWINSZ	/*	 |	get the window size	 */	if (ioctl(0, TIOCGWINSZ, &ws) >= 0)	{		if (ws.ws_row > 0)			LINES = ws.ws_row;		if (ws.ws_col > 0)			COLS = ws.ws_col;	}#endif	virtual_scr = newwin(LINES, COLS, 0, 0);	stdscr = newwin(LINES, COLS, 0, 0);	curscr = newwin(LINES, COLS, 0, 0);	wmove(stdscr, 0, 0);	werase(stdscr);	Repaint_screen = TRUE;	initialized = TRUE;	virtual_lines = (int *) malloc(LINES * (sizeof(int)));#ifdef SIGWINCH	/*	 |	reset size of windows and LINES and COLS if term window 	 |	changes size	 */	signal(SIGWINCH, reinitscr);#endif /* SIGWINCH */	/*	 |	check if scrolling is available	 */	nc_scrolling_ability = ((String_table[al__] != NULL) && 				(String_table[dl__])) || ((String_table[cs__]) 				&& (String_table[sr__]));}#ifndef CAPint Get_int()		/* get a two-byte integer from the terminfo file */{	int High_byte;	int Low_byte;	int temp;	Low_byte = *((unsigned char *) TERM_data_ptr++);	High_byte = *((unsigned char *) TERM_data_ptr++);	if (Flip_Bytes)	{		temp = Low_byte;		Low_byte = High_byte;		High_byte = temp;	}	if ((High_byte == 255) && (Low_byte == 255))		return (-1);	else		return(Low_byte + (High_byte * 256));}int INFO_PARSE()		/* parse off the data in the terminfo data file	*/{	int offset;	int magic_number = 0;	int counter = 0;	int Num_names = 0;	int Num_bools = 0;	int Num_ints = 0;	int Num_strings = 0;	int string_table_len = 0;	char *temp_ptr;	TERM_data_ptr = Data_Line = malloc((10240 * (sizeof(char))));	Data_Line_len = read(Fildes, Data_Line, 10240);	if ((Data_Line_len >= 10240) || (Data_Line_len < 0))		return(0);	/*	 |	get magic number	 */	magic_number = Get_int();	/*	 |	if magic number not right, reverse byte order and check again	 */	if (magic_number != 282)	{		Flip_Bytes = TRUE;		TERM_data_ptr--;		TERM_data_ptr--;		magic_number = Get_int();		if (magic_number != 282)			return(0);	}	/*	 |	get the number of each type in the terminfo data file	 */	Num_names = Get_int();	Num_bools = Get_int();	Num_ints = Get_int();	Num_strings = Get_int();	string_table_len = Get_int();	Strings = malloc(string_table_len);	while (Num_names > 0)	{		TERM_data_ptr++;		Num_names--;	}	counter = 0;	while (Num_bools)	{		Num_bools--;		Booleans[counter++] = *TERM_data_ptr++;	}	if (((unsigned int) TERM_data_ptr) & 1)	/* force alignment	*/		TERM_data_ptr++;	counter = 0;	while (Num_ints)	{		Num_ints--;		Numbers[counter] = Get_int();		counter++;	}	temp_ptr = TERM_data_ptr + Num_strings + Num_strings;	memcpy(Strings, temp_ptr, string_table_len);	counter = bt__;	while (Num_strings)	{		Num_strings--;		if ((offset=Get_int()) != -1)		{			if (String_table[counter] == NULL)				String_table[counter] = Strings + offset;		}		else			String_table[counter] = NULL;		counter++;	}	close(Fildes);	free(Data_Line);	return(TRUE);}#endif		/* ifndef CAP	*/int AtoI()		/* convert ascii text to integers	*/{	int Temp;	Temp = 0;	while ((*TERM_data_ptr >= '0') && (*TERM_data_ptr <= '9'))	{		Temp = (Temp * 10) + (*TERM_data_ptr - '0');		TERM_data_ptr++;	}	return(Temp);}

⌨️ 快捷键说明

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