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

📄 prmt5.c

📁 使用BorlandC++4.5编译的一个MUD客户端程序
💻 C
字号:
/* prmt5.c: Primitive functions: regexps, environment */
/* $Id: prmt5.c 2.1 1995/10/24 15:46:14 tsurace Release $ */

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

#ifdef __WIN32__
# include <stdio.h>
# define popen _popen
# define pclose _pclose
#endif

extern Unode file_ring;
extern Istr freader;

/* File primitives */

PDECL(pr_fopen)
{
	FILE *fp;
	Unode *un;

	Tcheck2(F_SPTR, F_SPTR);
	fp = fopen(expand(Soastr(Dp1)), Soastr(Dp2));
	if (fp) {
		un = unalloc();
		un->Fname = vtstrdup(Soastr(Dp1));
		un->Ftype = FT_FILE;
		un->Ffp = fp;
		un->prev = file_ring.prev;
		un->next = &file_ring;
		file_ring.prev = file_ring.prev->next = un;
		Dset_elem(*rf, F_FILE, Dunode, un);
	}
	Set_err_null(NULL);
}

PDECL(pr_popen)
{
	FILE *fp;
	Unode *un;

	Tcheck2(F_SPTR, F_SPTR);
	fp = popen(Soastr(Dp1), Soastr(Dp2));
	if (fp) {
		un = unalloc();
		un->Fname = vtstrdup(Soastr(Dp1));
		un->Ftype = FT_PROC;
		un->Ffp = fp;
		un->prev = file_ring.prev;
		un->next = &file_ring;
		file_ring.prev = file_ring.prev->next = un;
		Dset_elem(*rf, F_FILE, Dunode, un);
	}
	Set_err_null(NULL);
}

PDECL(pr_fclose)
{
	Tcheck1(F_FILE);
	Discardstring(Un->Fname);
	Dset_int(*rf, (Un->Ftype == FT_FILE) ? fclose(Un->Ffp)
					     : pclose(Un->Ffp));
	Set_err_neg(NULL);
	Un->prev->next = Un->next;
	Un->next->prev = Un->prev;
	destroy_pointers(Un->frefs);
	discard_unode(Un);
}

PDECL(pr_fwrite)
{
	Tcheck2(F_FILE, F_SPTR);
	Dset_int(*rf, Sinbounds(Dp2) ? fwrite(Sastr(Dp2), 1, Dp2.Slen
					      - Dp2.Dspos, Un1->Ffp) : 0);
	Set_err_neg(NULL);
}

PDECL(pr_fread)
{
	Tcheck1(F_FILE);
	isolate(&freader);
	if (s_fget(&freader.rs->str, Un->Ffp))
		Dset_sptr(*rf, istr_rs(freader.rs), 0);
	Set_err_null(NULL);
}

PDECL(pr_fseek)
{
	Tcheck3(F_FILE, F_INT, F_INT);
	Dset_int(*rf, fseek(Un1->Ffp, Int2, Int3));
	Set_err_neg(NULL);
}

PDECL(pr_ftell)
{
	Tcheck1(F_FILE);
	Dset_int(*rf, ftell(Un->Ffp));
	Set_err_neg(NULL);
}

PDECL(pr_fputc)
{
	Tcheck2(F_INT, F_FILE);
	Dset_int(*rf, putc(Int1, Un2->Ffp));
	Set_err_neg(NULL);
}

PDECL(pr_fgetc)
{
	Tcheck1(F_FILE);
	Dset_int(*rf, getc(Un->Ffp));
	Set_err_neg(NULL);
}

PDECL(pr_fflush)
{
	Tcheck1(F_FILE);
	fflush(Un->Ffp);
}

PDECL(pr_feof)
{
	Tcheck1(F_FILE);
	Dset_int(*rf, feof(Un->Ffp));
}

PDECL(pr_fsize)
{
	struct stat buf;

	Tcheck1(F_SPTR);
	Dset_int(*rf, (stat(Soastr(Dp), &buf) == -1) ? -1 : buf.st_size);
	Set_err_neg(NULL);
}

PDECL(pr_fmtime)
{
	struct stat buf;

	Tcheck1(F_SPTR);
	Dset_int(*rf, (stat(Soastr(Dp), &buf) == -1) ? -1 : buf.st_mtime);
	Set_err_neg(NULL);
}

PDECL(pr_unlink)
{
	Tcheck1(F_SPTR);
	Dset_int(*rf, unlink(Soastr(Dp)));
	Set_err_neg(NULL);
}

PDECL(pr_load_file)
{
	Tcheck1(F_SPTR);
	Dset_int(*rf, load_file(Soastr(Dp)));
	Set_err_neg(NULL);
}

PDECL(pr_find_file)
{
	Unode *f;

	Tcheck1(F_SPTR);
	for (f = file_ring.next; !f->dummy; f = f->next) {
		if (streq(f->Fname, Soastr(Dp)))
			break;
	}
	if (f->dummy)
		return;
	Dset_elem(*rf, F_FILE, Dunode, f);
}

PDECL(pr_file_name)
{
	Tcheck1(F_FILE);
	Dset_sptr(*rf, istr_s(Un->Fname), 0);
}

/* Regexp primitives */

PDECL(pr_regcomp)
{
	regexp *reg;

	Tcheck1(F_SPTR);
	reg = regcomp(Soastr(Dp));
	if (reg) {
		reg->refs = 0;
		reg->rs = NULL;
		Dset_elem(*rf, F_REG, Dreg, reg);
	}
	vtc_errflag = (rf->type == F_NULL);
}

PDECL(pr_regexec)
{
	regexp *reg = Dp1.Dreg;

	Tcheck2(F_REG, F_SPTR);
	Dset_int(*rf, regexec(reg, Soastr(Dp2)));
	if (reg->rs)
		dec_ref_rstr(reg->rs);
	if (rf->Dval) {
		reg->rs = Dp2.Distr->rs;
		reg->rs->refs++;
	} else
		reg->rs = NULL;
}

PDECL(pr_regmatch)
{
	regexp *r = Dp1.Dreg;
	int n = Int2;

	Tcheck2(F_REG, F_INT);
	if (n < 0 || n > NSUBEXP || !r->rs || !r->startp[n])
		return;
	Dset_sptr(*rf, istr_sl(r->startp[n], r->endp[n] - r->startp[n]), 0);
}

/* Environment primitives */

PDECL(pr_getenv)
{
	char *env;

	Tcheck1(F_SPTR);
	env = getenv(Soastr(Dp));
	if (env)
		Dset_sptr(*rf, istr_s(env), 0);
	Set_err_null(NULL);
}

PDECL(pr_system)
{
	Tcheck1(F_SPTR);
	tty_mode(0);
	Dset_int(*rf, system(Soastr(Dp)));
	tty_mode(1);
}

PDECL(pr_ctime)
{
	Tcheck1(F_INT);
	Dset_sptr(*rf, istr_s(ctime(&Int)), 0);
}

PDECL(pr_smatch)
{
	Tcheck2(F_SPTR, F_SPTR);
	Dset_int(*rf, smatch(Soastr(Dp1), Soastr(Dp2)));
}


⌨️ 快捷键说明

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