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

📄 prmtab.c

📁 使用BorlandC++4.5编译的一个MUD客户端程序
💻 C
字号:
/* prmtab.c: The primitive table */
/* $Id: prmtab.c 2.1 1995/10/24 15:46:14 tsurace Release $ */

#include "vt.h"

#define PTSIZE 201
#define NUM_OPER 24
#define NUM_PRMT (sizeof(prmtab) / sizeof(Prmt))

struct int_list {
	char *name;
	int num;
	struct int_list *next;
};

Dframe suspend_frame, frame_error;
extern Cframe *cstack;
extern int cpos, curprmt;

extern void
	op_bor(),
	op_bxor(),
	op_band(),
	op_eq(),
	op_ne(),
	op_lt(),
	op_le(),
	op_gt(),
	op_ge(),
	op_sl(),
	op_sr(),
	op_add(),
	op_sub(),
	op_mult(),
	op_div(),
	op_mod(),
	op_postinc(),
	op_postdec(),
	op_preinc(),
	op_predec(),
	op_not(),
	op_compl(),
	op_neg(),
	op_asn(),
	pr_write(),
	pr_cmove(),
	pr_scroll(),
	pr_scr_fwd(),
	pr_scr_rev(),
	pr_clrscr(),
	pr_clreol(),
	pr_bold(),
	pr_curs_reset(),
	pr_split(),
	pr_close(),
	pr_resize(),
	pr_set_termread(),
	pr_set_obj(),
	pr_obj(),
	pr_echo(),
	pr_cecho(),
	pr_display(),
	pr_read(),
	pr_reread(),
	pr_pass(),
	pr_win_top(),
	pr_win_bottom(),
	pr_win_col(),
	pr_win_rmt(),
	pr_win_termread(),
	pr_connect(),
	pr_disconnect(),
	pr_set_netread(),
	pr_set_promptread(),
	pr_set_back(),
	pr_set_busy(),
	pr_set_raw(),
	pr_send(),
	pr_input_waiting(),
	pr_rmt_addr(),
	pr_rmt_port(),
	pr_rmt_win(),
	pr_rmt_netread(),
	pr_rmt_promptread(),
	pr_rmt_back(),
	pr_rmt_busy(),
	pr_rmt_raw(),
	pr_rmt_echo(),
	pr_rmt_eor(),
	pr_insert(),
	pr_edfunc(),
	pr_getch(),
	pr_bind(),
	pr_unbind(),
	pr_find_key(),
	pr_key_seq(),
	pr_key_func(),
	pr_strcpy(),
	pr_strcat(),
	pr_strdup(),
	pr_strcmp(),
	pr_stricmp(),
	pr_strchr(),
	pr_strrchr(),
	pr_strcspn(),
	pr_strstr(),
	pr_stristr(),
	pr_strupr(),
	pr_strlwr(),
	pr_strlen(),
	pr_wrap(),
	pr_ucase(),
	pr_lcase(),
	pr_itoa(),
	pr_atoi(),
	pr_find_func(),
	pr_find_prmt(),
	pr_func_name(),
	pr_callv(),
	pr_detach(),
	pr_abort(),
	pr_alloc(),
	pr_new_assoc(),
	pr_lookup(),
	pr_acopy(),
	pr_base(),
	pr_garbage(),
	pr_parse(),
	pr_head(),
	pr_tail(),
	pr_next(),
	pr_prev(),
	pr_type(),
	pr_find_var(),
	pr_sleep(),
	pr_quit(),
	pr_rndseed(),
	pr_fopen(),
	pr_popen(),
	pr_fclose(),
	pr_fwrite(),
	pr_fread(),
	pr_fseek(),
	pr_ftell(),
	pr_fputc(),
	pr_fgetc(),
	pr_fflush(),
	pr_feof(),
	pr_fsize(),
	pr_fmtime(),
	pr_unlink(),
	pr_load_file(),
	pr_find_file(),
	pr_file_name(),
	pr_regcomp(),
	pr_regexec(),
	pr_regmatch(),
	pr_smatch(),
	pr_getenv(),
	pr_system(),
	pr_ctime();

/* The positions of the operators must correspond to the defined values
** in pnode.h */

Prmt prmtab[] = {
	/* Operators (oper.c) */
	{ "|"		, op_bor	,  2 },
	{ "^"		, op_bxor	,  2 },
	{ "&"		, op_band	,  2 },
	{ "=="		, op_eq		,  2 },
	{ "!="		, op_ne		,  2 },
	{ "<"		, op_lt		,  2 },
	{ "<="		, op_le		,  2 },
	{ ">"		, op_gt		,  2 },
	{ ">="		, op_ge		,  2 },
	{ "<<"		, op_sl		,  2 },
	{ ">>"		, op_sr		,  2 },
	{ "+"		, op_add	,  2 },
	{ "-"		, op_sub	,  2 },
	{ "*"		, op_mult	,  2 },
	{ "/"		, op_div	,  2 },
	{ "%"		, op_mod	,  2 },
	{ "++"		, op_postinc	,  1 },
	{ "--"		, op_postdec	,  1 },
	{ "++"		, op_preinc	,  1 },
	{ "--"		, op_predec	,  1 },
	{ "!"		, op_not	,  1 },
	{ "~"		, op_compl	,  1 },
	{ "-"		, op_neg	,  1 },
	{ "="		, op_asn	,  2 },
	/* Screen handling (prmt1.c) */
	{ "write"	, pr_write	, -1 },
	{ "cmove"	, pr_cmove	,  2 },
	{ "scroll"	, pr_scroll	,  2 },
	{ "scr_fwd"	, pr_scr_fwd	,  1 },
	{ "scr_rev"	, pr_scr_rev	,  1 },
	{ "clrscr"	, pr_clrscr	,  0 },
	{ "clreol"	, pr_clreol	,  0 },
	{ "bold"	, pr_bold	,  1 },
	{ "curs_reset"	, pr_curs_reset ,  0 },
	/* Windows (prmt1.c) */
	{ "split"	, pr_split	,  2 },
	{ "close"	, pr_close	,  2 },
	{ "resize"	, pr_resize	,  2 },
	{ "set_termread", pr_set_termread, 2 },
	{ "set_obj"	, pr_set_obj	,  2 },
	{ "obj"		, pr_obj	,  1 },
	{ "echo"	, pr_echo	, -1 },
	{ "display"	, pr_display	,  2 },
	{ "read"	, pr_read	, -1 },
	{ "reread"	, pr_reread	, -1 },
	{ "pass"	, pr_pass	,  2 },
	{ "win_top"	, pr_win_top	,  1 },
	{ "win_bottom"	, pr_win_bottom ,  1 },
	{ "win_col"	, pr_win_col	,  1 },
	{ "win_rmt"	, pr_win_rmt	,  1 },
	{ "win_termread", pr_win_termread, 1 },
	/* Remotes (prmt2.c) */
	{ "connect"	, pr_connect	,  2 },
	{ "disconnect"	, pr_disconnect ,  1 },
	{ "set_netread" , pr_set_netread,  2 },
	{ "set_promptread", pr_set_promptread, 2 },
	{ "set_back"	, pr_set_back	,  2 },
	{ "set_busy"	, pr_set_busy	,  2 },
	{ "set_raw"	, pr_set_raw	,  2 },
	{ "send"	, pr_send	, -1 },
	{ "input_waiting", pr_input_waiting,  1 },
	{ "rmt_addr"	, pr_rmt_addr	,  1 },
	{ "rmt_port"	, pr_rmt_port	,  1 },
	{ "rmt_win"	, pr_rmt_win	,  1 },
	{ "rmt_netread" , pr_rmt_netread,  1 },
	{ "rmt_promptread", pr_rmt_promptread, 1 },
	{ "rmt_back"	, pr_rmt_back	,  1 },
	{ "rmt_busy"	, pr_rmt_busy	,  1 },
	{ "rmt_raw"	, pr_rmt_raw	,  1 },
	{ "rmt_echo"	, pr_rmt_echo	,  1 },
	{ "rmt_eor"	, pr_rmt_eor	,  1 },
	/* Key buffer (prmt2.c) */
	{ "insert"	, pr_insert	,  1 },
	{ "edfunc"	, pr_edfunc	,  1 },
	{ "getch"	, pr_getch	, -1 },
	/* Keys (prmt2.c) */
	{ "bind"	, pr_bind	,  2 },
	{ "unbind"	, pr_unbind	,  1 },
	{ "find_key"	, pr_find_key	,  1 },
	{ "key_seq"	, pr_key_seq	,  1 },
	{ "key_func"	, pr_key_func	,  1 },
	/* String functions (prmt3.c) */
	{ "strcpy"	, pr_strcpy	, -1 },
	{ "strcat"	, pr_strcat	, -1 },
	{ "strdup"	, pr_strdup	,  1 },
	{ "strcmp"	, pr_strcmp	, -1 },
	{ "stricmp"	, pr_stricmp	, -1 },
	{ "strchr"	, pr_strchr	, -1 },
	{ "strrchr"	, pr_strrchr	, -1 },
	{ "strcspn"	, pr_strcspn	,  2 },
	{ "strstr"	, pr_strstr	,  2 },
	{ "stristr"	, pr_stristr	,  2 },
	{ "strupr"	, pr_strupr	,  1 },
	{ "strlwr"	, pr_strlwr	,  1 },
	{ "strlen"	, pr_strlen	,  1 },
	{ "wrap"	, pr_wrap	, -1 },
	{ "ucase"	, pr_ucase	,  1 },
	{ "lcase"	, pr_lcase	,  1 },
	{ "itoa"	, pr_itoa	,  1 },
	{ "atoi"	, pr_atoi	,  1 },
	/* Functions (prmt4.c) */
	{ "find_func"	, pr_find_func	,  1 },
	{ "find_prmt"	, pr_find_prmt	,  1 },
	{ "func_name"	, pr_func_name	,  1 },
	{ "callv"	, pr_callv	, -1 },
	{ "detach"	, pr_detach	, -1 },
	{ "abort"	, pr_abort	,  0 },
	/* Arrays (prmt4.c) */
	{ "alloc"	, pr_alloc	, -1 },
	{ "new_assoc"	, pr_new_assoc	,  0 },
	{ "lookup"	, pr_lookup	,  2 },
	{ "acopy"	, pr_acopy	,  3 },
	{ "base"	, pr_base	,  1 },
	{ "garbage"	, pr_garbage	,  0 },
	/* Misc (prmt4.c) */
	{ "parse"	, pr_parse	,  1 },
	{ "head"	, pr_head	,  1 },
	{ "tail"	, pr_tail	,  1 },
	{ "next"	, pr_next	,  1 },
	{ "prev"	, pr_prev	,  1 },
	{ "type"	, pr_type	,  1 },
	{ "find_var"	, pr_find_var	,  1 },
	{ "sleep"	, pr_sleep	,  1 },
	{ "quit"	, pr_quit	,  0 },
	{ "rndseed"	, pr_rndseed	,  1 },
	/* Files (prmt5.c) */
	{ "fopen"	, pr_fopen	,  2 },
	{ "popen"	, pr_popen	,  2 },
	{ "fclose"	, pr_fclose	,  1 },
	{ "fwrite"	, pr_fwrite	,  2 },
	{ "fread"	, pr_fread	,  1 },
	{ "fputc"	, pr_fputc	,  2 },
	{ "fseek"	, pr_fseek	,  3 },
	{ "ftell"	, pr_ftell	,  1 },
	{ "fgetc"	, pr_fgetc	,  1 },
	{ "fflush"	, pr_fflush	,  1 },
	{ "feof"	, pr_feof	,  1 },
	{ "fsize"	, pr_fsize	,  1 },
	{ "fmtime"	, pr_fmtime	,  1 },
	{ "unlink"	, pr_unlink	,  1 },
	{ "load_file"	, pr_load_file	,  1 },
	{ "find_file"	, pr_find_file	,  1 },
	{ "file_name"	, pr_file_name	,  1 },
	/* Regexps (prmt5.c) */
	{ "regcomp"	, pr_regcomp	,  1 },
	{ "regexec"	, pr_regexec	,  2 },
	{ "regmatch"	, pr_regmatch	,  2 },
	{ "smatch"	, pr_smatch	,  2 },
	/* Environment (prmt5.c) */
	{ "getenv"	, pr_getenv	,  1 },
	{ "system"	, pr_system	,  1 },
	{ "ctime"	, pr_ctime	,  1 },
};

static struct int_list *phtab[PTSIZE];
static struct int_list entries[NUM_PRMT - NUM_OPER];

void init_prmt()
{
	int i, ind;
	struct int_list *entry;

	for (entry = entries, i = NUM_OPER; i < NUM_PRMT; i++, entry++) {
		ind = hash(prmtab[i].name, PTSIZE);
		entry->name = prmtab[i].name;
		entry->num = i;
		entry->next = phtab[ind];
		phtab[ind] = entry;
	}
	suspend_frame.type = frame_error.type = F_EXCEPT;
	suspend_frame.Dval = INTERP_SUSPEND;
	frame_error.Dval = INTERP_ERROR;
}

int find_prmt(name)
	char *name;
{
	struct int_list *entry;

	for (entry = phtab[hash(name, PTSIZE)]; entry; entry = entry->next) {
		if (streq(name, entry->name))
			return entry->num;
	}
	return -1;
}

void finish_error()
{
	char *fname;

	fname = lookup_prog(cstack[cpos - 1].prog);
	if (fname)
		outputf(" in %s", fname);
	coutput("\n");
}

void type_errmsg()
{
	outputf("Error: Invalid arguments to primitive %s",
		prmtab[curprmt].name);
	finish_error();
}

void type_error(rf)
	Dframe *rf;
{
	*rf = frame_error;
	type_errmsg();
}

void bounds_error(rf)
	Dframe *rf;
{
	*rf = frame_error;
	outputf("Error: Out-of-bounds argument to primitive %s",
		prmtab[curprmt].name);
	finish_error();
}


⌨️ 快捷键说明

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