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

📄 trig.vtc

📁 Unix下的MUD客户端程序
💻 VTC
字号:
Ttrig ?:= new_assoc();&Ttrig->name;  &Ttrig->pattern; &Ttrig->reg;   &Ttrig->cmd;   &Ttrig->pri;&Ttrig->world; &Ttrig->enabled; &Ttrig->rearm; &Ttrig->style;enum(&S_NORM, &S_GAG, &S_NOHISTGAG, &S_HILITE);style_names ?:= table("Normal", "Gag", "No-history gag", "Hilite");trigs ?:= new_list();trig_id ?:= 0;func find_trig(name) [i] {	if (!*name)		return NULL;	if (*name == '#') {		i = atoi(name + 1);		return i >= 1 && i <= *trigs ? &trigs[i] : NULL;	}	for (i = 1; i <= *trigs; i++) {		if (!stricmp(trigs[i]->name, name))			return &trigs[i];	}}func Find_trig(name) --> efind(.find_trig, "trigger", name)func add_trig(name, pat, cmd, pri, w, on, rearm, style, isreg) [trig, i, r] {	if (*name == '#')		trig_id = max(atoi(name + 1) + 1, trig_id);	else if (!*name)		name = "#" + itoa(trig_id++);	if (isreg && !(r = regcomp(pat)))		return output("regcomp failed\n");	trig = ptable(Ttrig, name, pat, r, cmd, pri, w, on, rearm, style);	for (i = 1; i <= *trigs && stricmp(trigs[i]->name, name); i++);	if (i <= *trigs)		del_list(trigs, i);	insert_trig(trig);}func Add_trig(name, pat, cmd, pri, wname, on, rearm, style, isreg) {	add_trig(name, pat, cmd, pri, find_world(wname), on, rearm, style,		 isreg);}func del_trig(name) [t, i, f] {	if (*name == '#') {		i = atoi(name + 1);		if (i >= 1 && i <= *trigs)			del_list(trigs, i);		else			output("Trigger number out of range\n");		return;	}	for (i = 1; i <= *trigs; i++) {		if (*trigs[i]->name != '#' && smatch(name, trigs[i]->name)		 || smatch(name, trigs[i]->pattern)) {			del_list(trigs, i--);			f = 1;		}	}	if (!f)		printf("Couldn't find trigger %s\n", name);}func edit_trig(name, pri, enabled, rearm, style, world) [t, offset] {	t = Find_trig(name);	offset = t - trigs;	t = *t;	if (pri != NULL) {		t->pri = pri;		del_list(trigs, offset);		insert_trig(t);	}	if (enabled != NULL)	t->enabled = enabled;	if (rearm != NULL)	t->rearm = !rearm;	if (style != NULL)	t->style = style;	if (world == 0)		t->world = NULL;	else if (world)		t->world = world;}func insert_trig(t) [i] {	for (i = 1; i <= *trigs && trigs[i]->pri >= t->pri; i++);	add_list(trigs, t, i);}func check_triggers(text) [i, pri, trig, style] {	pri = 0;	style = S_NORM;	for (i = 1; i <= *trigs && trigs[i]->pri >= pri; i++) {		trig = trigs[i];		if (trig->world && trig->world != cur_world() || !trig->enabled		    || trig->reg && !regexec(trig->reg, text)		    || !trig->reg && !smatch(trig->pattern, text))			continue;		run_cmd(trig, text);		pri = trig->pri;		trig->enabled = trig->rearm;		style = max(style, trig->style);	}	return style;}func run_cmd(trig, text) [f, a] {	if (!trig->reg) {		a = explo(text, " ");		a[0] = text;	} else		a = regmatch_array(trig->reg);	f = (type(trig->cmd) == T_FPTR) ? .detach : .process_cmdline;	(*f)(trig->cmd, text, a);}func regmatch_array(reg) [a, i] {	a = alloc(NSUBEXP);	for (i = 0; i < NSUBEXP; i++)		a[i] = regmatch(reg, i);	return a;}stchars = table('n', 'g', 'G', 'h');func list_trigs(s) [i, trig] {	for (i = 1; i <= *trigs; i++) {		trig = trigs[i];		if (trig->world && trig->world != cur_world()		    || *s && !smatch(s, trig->name))			continue;		printf("%3d: %4d%c%c %10s %s\n", i, trig->pri,			trig->enabled ? '+' : '-', stchars[trig->style],			(*trig->name == '#') ? "" : trig->name, trig->pattern);	}}func list_style(style, s) [i, trig] {	for (i = 1; i <= *trigs; i++) {		trig = trigs[i];		if (trig->world && trig->world != cur_world() ||		    trig->style != style || *s && !smatch(s, trig->name))			continue;		printf("%3d: %s\n", i, trig->pattern);	}}func print_trig(n) [trig] {	t = Find_trig(n);	trig = *t;	if (*trig->name != '#')		printf("Name: %s\n", trig->name);	printf("%s: %s\n", trig->reg ? "Regexp" : "Pattern", trig->pattern);	printf("Priority: %d\n", trig->pri);	if (trig->world)		printf("World: %s\n", trig->world->name);	if (type(trig->cmd) == T_FPTR)		printf("Function: %s\n", func_name(trig->cmd));	else		printf("Command: %s\n", trig->cmd);	output("Flags: ");	output(trig->enabled ? "Enabled, " : "Disabled, ");	output(trig->rearm ? "Permanent, " : "One-shot, ");	printf("%s\n", style_names[trig->style]);}func purge_world_trigs(w) [i] {	for (i = 1; i < *trigs; i++) {		if (trigs[i]->world == w)			del_list(trigs, i--);	}}func save_trigs(fp) [i, t] {	for (i = 1; i <= *trigs; i++) {		t = base(trigs[i]);		fprintf(fp, "Add_trig(%s);\n", arglist(t[0], t[1], t[3], t[4],			t[5] ? t[5]->name : "", t[6], t[7], t[8],			t[2] ? 1 : 0));	}}func Trig(s) [arg, style, pri, pat, cmd, p, w] {	s = getopt(s, "e1hgrPNW", arg = table(1, 0, 0, 0, 0, "", "", NULL));	style = arg[2] ? S_HILITE : (arg[3] == 2) ? S_NOHISTGAG :		arg[3] ? S_GAG : S_NORM;	pri = max(atoi(arg[5]), 0);	if (arg[7]) {		w = find_world(arg[7]);		if (!w)			return printf("Can't find world %s\n", arg[7]);	}	p = strchr(s, '=') ? : s + strlen(s);	cmd = strdup(skipspaces(p + 1));	while (*--p == ' ')		;	strcpy(pat = "", s, p + 1 - s);	add_trig(arg[6], pat, cmd, pri, w, arg[0], !arg[1], style, arg[4]);}func Edit(s) [arg, style, pri, world] {	s = getopt(s, "e1hgnPW", arg = alloc(7));	style = arg[2] ? S_HILITE : (arg[3] == 2) ? S_NOHISTGAG :		arg[3] ? S_GAG : arg[4] ? S_NORM : NULL;	pri = arg[5] ? max(atoi(arg[5]), 0) : NULL;	if (arg[6]) {		if (!*arg[6])			world = 0;		else {			world = find_world(arg[6]);			if (!world)				return printf("Can't find world %s\n", arg[6]);		}	}	edit_trig(s, pri, arg[0], arg[1], style, world);}func Untrig(name) { del_trig(name); }func Hilite(s) { Trig("-h " + s); }func Gag(s) { Trig("-g " + s); }func List_trigs(s) { print_or_list(s, .print_trig, .list_trigs); }func List_norms(s) { list_style(S_NORM, s); }func List_gags(s) { list_style(S_GAG, s); }func List_hilites(s) { list_style(S_HILITE, s); }add_cmd("trig", -1, .Trig, \	"/trig [+|-e1hg] [-p<pri>] [-n<name>] [-w<world>] <pattern> = <cmd>");add_cmd("hilite", -1, .Hilite, \	"/hilite [+|-e1] [-p<pri>] [-n<name>] [-w<world>] <pattern> = <cmd>");add_cmd("gag", -1, .Gag, \	"/gag [+|-e1] [-p<pri>] [-n<name>] [-w<world>] <pattern> = <cmd>");add_cmd("edit", -1, .Edit, "/edit [+|-e1hgn] [-p<pri>] [-w[<world>]] <name>");add_cmd("list_trigs", -1, .List_trigs, "/list_trigs [<which>]");add_cmd("list_norms", -1, .List_norms, "/list_norms");add_cmd("list_gags", -1, .List_gags, "/list_gags");add_cmd("list_hilites", -1, .List_hilites, "/list_hilites");add_cmd("untrig", -1, .Untrig, "/untrig {<name>|#<number>}");

⌨️ 快捷键说明

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