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

📄 prmt1.c

📁 使用BorlandC++4.5编译的一个MUD客户端程序
💻 C
字号:
head	2.1;access;symbols;locks; strict;comment	@ * @;2.1date	95.10.24.15.46.14;	author tsurace;	state Release;branches;next	1.1;1.1date	95.10.12.19.38.35;	author tsurace;	state Beta;branches;next	;desc@Primitives - windows, screen@2.1log@Roll.@text@/* prmt1.c: Primitive functions: screen handling, windows */
/* $Id: prmt1.c 1.1 1995/10/12 19:38:35 tsurace Beta tsurace $ */

#include "vt.h"
#include "prmt.h"

extern int curs_loc;
#define CURS_ELSEWHERE 2

extern 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);
}


@1.1log@Initial revision@text@d2 1a2 1/* $Id$ */@

⌨️ 快捷键说明

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