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

📄 prmt5.c

📁 Unix下的MUD客户端程序
💻 C
字号:
/* prmt5.c: Primitive functions: regexps, environment */#include "vt.h"#include "prmt.h"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 + -