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

📄 prmt1.c

📁 Unix下的MUD客户端程序
💻 C
字号:
/* prmt1.c: Primitive functions: screen handling, windows */#include "vt.h"#include "prmt.h"extern int curs_loc;#define CURS_ELSEWHERE 2extern Estate *gen_read;extern Dframe suspend_frame;extern int rows;/* Screen handling primitives */PDECL(pr_write){	for (; argc--; argv++) {		Tcheckgen(argv->type != F_SPTR);		if (Sinbounds(*argv))			vtwrite(Scstr(*argv));	}}PDECL(pr_cmove){	Tcheck2(F_INT, F_INT);	cmove(Int1, Int2);	bflushfunc();}PDECL(pr_scroll){	Tcheck2(F_INT, F_INT);	scroll(Int1, Int2);	bflushfunc();}PDECL(pr_scr_fwd){	Tcheck1(F_INT);	scr_fwd(Int);	bflushfunc();}PDECL(pr_scr_rev){	Tcheck2(F_INT, F_INT);	scr_rev(Int);	bflushfunc();}PDECL(pr_clrscr){	clrscr();}PDECL(pr_clreol){	clreol();}PDECL(pr_bold){	bold(Dftrue(Dp));}PDECL(pr_curs_reset){	curs_loc = CURS_ELSEWHERE;}/* Window primitives */PDECL(pr_split){	Tcheck2(F_WIN, F_INT);	if (Int2 >= Un1->Wtop + 2 && Int2 <= Un1->Wbot - 2)		Dset_elem(*rf, F_WIN, Dunode, split_window(Un1, Int2));	Set_err_null("Argument out of range");}PDECL(pr_close){	Tcheck2(F_WIN, F_INT);	Dset_int(*rf, 0);	Int2 = Int2 ? Int2 : Un1->prev->dummy ? 1 : -1;	if ((!Un1->prev->dummy || Int2 > 0) && (!Un1->next->dummy || Int2 < 0))		close_window(Un1, Int2);	else		rf->Dval = -1;	Set_err_neg("Cannot close window in given direction");}PDECL(pr_resize){	int bot;	Tcheck2(F_WIN, F_INT);	bot = Un1->next->dummy ? rows - 2 : Un1->next->Wbot - 2;	if (Int2 <= bot && Int2 >= Un1->Wtop + 2) {		resize_window(Un1, Int2);		Dset_int(*rf, 0);	} else		Dset_int(*rf, -1);	Set_err_neg("Argument out of range");}PDECL(pr_set_termread){	Tcheckgen(T1 != F_WIN || T2 != F_FPTR && T2 != F_NULL);	Un1->Wtermread = T2 == F_FPTR ? Dp2.Dfunc : NULL;}PDECL(pr_set_obj){	Dframe **objptr;	Tcheckgen(T1 != F_WIN && T1 != F_RMT);	objptr = (T1 == F_WIN) ? &Un1->Wobj : &Un1->Robj;	if (*objptr)		deref_frame(*objptr);	else		*objptr = New(Dframe);	**objptr = Dp2;	ref_frame(*objptr);}PDECL(pr_obj){	Dframe *obj;	Tcheckgen(T != F_WIN && T != F_RMT);	obj = (T == F_WIN) ? Un->Wobj : Un->Robj;	if (obj)		*rf = *obj;}PDECL(pr_echo){	Unode *win = Cur_win;	if (argc && argv[0].type == F_WIN) {		win = argv[0].Dunode;		argv++;		argc--;	}	while (argc--) {		Tcheckgen(argv->type != F_SPTR);		output(win, Soastr(*argv));		argv++;	}}PDECL(pr_display){	Tcheckgen(T1 != F_WIN || T2 != F_RMT && T2 != F_NULL);	if (T2 == F_RMT && Un2->Rwin) {		Dset_int(*rf, (Un2->Rwin == Un1) ? 0 : -1);		Set_err_neg("Remote already displayed");		return;	}	vtc_errflag = 0;	if (Un1->Wrmt)		Un1->Wrmt->Rwin = NULL;	Un1->Wrmt = (T2 == F_RMT) ? Un2 : NULL;	if (T2 == F_RMT)		Un2->Rwin = Un1;	update_echo_mode();	Dset_int(*rf, 0);}PDECL(pr_read){	Estate *image;	Tcheckgen(argc > 1 || argc == 1 && T != F_WIN && T != F_RMT);	image = suspend(argc);	add_ioqueue(!argc ? &gen_read : T == F_WIN ? &Un->Wrstack		    : &Un->Rrstack, image);	*rf = suspend_frame;}PDECL(pr_reread){	Estate *image, **queue;	Tcheckgen(argc > 1 || argc == 1 && T != F_WIN && T != F_RMT);	image = suspend(argc);	queue = !argc ? &gen_read : T == F_WIN ? &Un->Wrstack : &Un->Rrstack;	image->next = *queue;	*queue = image;	*rf = suspend_frame;}PDECL(pr_pass){	Istr *is;	Tcheckgen(T1 != F_WIN && T1 != F_RMT || T2 != F_SPTR);	is = Dp2.Dspos ? istr_c(Socstr(Dp2)) : istr_rs(Dp2.Distr->rs);	if (T1 == F_WIN)		give_window(Un1, is);	else		give_remote(Un1, is, 0);}PDECL(pr_win_top){	Tcheck1(F_WIN);	Dset_int(*rf, Un->Wtop);}PDECL(pr_win_bottom){	Tcheck1(F_WIN);	Dset_int(*rf, Un->Wbot);}PDECL(pr_win_col){	Tcheck1(F_WIN);	Dset_int(*rf, Un->Wcol);}PDECL(pr_win_rmt){	Tcheck1(F_WIN);	if (Un->Wrmt)		Dset_elem(*rf, F_RMT, Dunode, Un->Wrmt);}PDECL(pr_win_termread){	Tcheck1(F_WIN);	if (Un->Wtermread)		Dset_elem(*rf, F_FPTR, Dfunc, Un->Wtermread);}

⌨️ 快捷键说明

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