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

📄 prmt3.c

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

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

#define Tcheck23(a, b) Tcheckgen(argc < 2 || T1 != (a) || T2 != (b) || \
				 argc == 3 && T3 != F_INT || argc > 3)

extern Istr wrapbuf;
extern char *strrchr();

/* String primitives */

PDECL(pr_strcpy)
{
	String *s1;
	int len;

	Tcheck23(F_SPTR, F_SPTR);
	if (Dp1.Dspos < 0)
		Berror;
	isolate(Dp1.Distr);
	s1 = &Dp1.Sstr;
	len = (argc == 2 || Int3 > Salen(Dp2)) ? Salen(Dp2) : Int3;
	if (Dp1.Dspos >= s1->c.l) {
		lcheck(s1, Dp1.Dspos);
		memset(s1->c.s + s1->c.l, ' ', Dp1.Dspos - s1->c.l);
		s1->c.s[s1->c.l = Dp1.Dspos] = '\0';
	}
	*rf = Dp1;
	if (!Sinbounds(Dp2) || argc == 3 && Int3 < 0)
		s_term(s1, Dp1.Dspos);
	else if (Dp1.Distr != Dp2.Distr) {
		s_term(s1, Dp1.Dspos);
		s_cat(s1, cstr_sl(Sastr(Dp2), len));
	} else if (Dp1.Dspos < Dp2.Dspos) {
		bcopy(Sastr(Dp2), Sastr(Dp1), len);
		s1->c.s[s1->c.l = Dp1.Dspos + len] = '\0';
	} else if (Dp1.Dspos > Dp2.Dspos) {
		lcheck(s1, Dp1.Dspos + len);
		bcopy_fwd(Sastr(Dp2), Sastr(Dp1), len);
		s1->c.s[s1->c.l = Dp1.Dspos + len] = '\0';
	}
}

PDECL(pr_strcat)
{
	String *s1;
	int len;

	Tcheck23(F_SPTR, F_SPTR);
	Bcheck(Dp1.Dspos < 0);
	isolate(Dp1.Distr);
	s1 = &Dp1.Sstr;
	len = argc == 2 || Int3 > Solen(Dp2) ? Solen(Dp2) :
	      Int3 <= 0 ? 0 : Int3;
	if (Dp1.Dspos >= s1->c.l) {
		lcheck(s1, Dp1.Dspos);
		memset(s1->c.s + s1->c.l, ' ', Dp1.Dspos - s1->c.l);
		s1->c.l = Dp1.Dspos;
	}
	s_cat(s1, cstr_sl(Soastr(Dp2), len));
	*rf = Dp1;
}

PDECL(pr_strdup)
{
	Tcheck1(F_SPTR);
	Dset_sptr(*rf, istr_rs(Dp.Distr->rs), Dp.Dspos);
}

PDECL(pr_strcmp)
{
	Tcheck23(F_SPTR, F_SPTR);
	Dset_int(*rf, (argc == 2) ? strcmp(Soastr(Dp1), Soastr(Dp2))
		      : strncmp(Soastr(Dp1), Soastr(Dp2), max(Int3, 0)));
}

PDECL(pr_stricmp)
{
	Tcheck23(F_SPTR, F_SPTR);
	Dset_int(*rf, (argc == 2) ? strcasecmp(Soastr(Dp1), Soastr(Dp2))
		      : strncasecmp(Soastr(Dp1), Soastr(Dp2), max(Int3, 0)));
}

PDECL(pr_strchr)
{
	char *ptr;

	Tcheck23(F_SPTR, F_INT);
	if (!Sinbounds(Dp1) && Int2 == '\0') {
		*rf = Dp1;
		return;
	}
	if (argc == 3) {
		Int3 = min(max(Int3, 0), Dp1.Slen);
		ptr = vtstrnchr(Soastr(Dp1), Int2, Int3);
	} else
		ptr = strchr(Soastr(Dp1), Int2);
	if (ptr)
		Dset_sptr(*rf, Dp1.Distr, ptr - Dp1.Sbegin);
}

PDECL(pr_strrchr)
{
	char *ptr;

	Tcheck23(F_SPTR, F_INT);
	if (!Sinbounds(Dp1) && Int2 == '\0') {
		*rf = Dp1;
		return;
	}
	if (argc == 3) {
		Int3 = min(max(Int3, 0), Dp1.Slen);
		ptr = vtstrnrchr(Soastr(Dp1), Int2, Int3);
	} else
		ptr = strrchr(Soastr(Dp1), Int2);
	if (ptr)
		Dset_sptr(*rf, Dp1.Distr, ptr - Dp1.Sbegin);
}

PDECL(pr_strcspn)
{
	Tcheck2(F_SPTR, F_SPTR);
	Dset_int(*rf, strcspn(Soastr(Dp1), Soastr(Dp2)));
}

PDECL(pr_strstr)
{
	char *ptr;

	Tcheck2(F_SPTR, F_SPTR);
	if (!Sinbounds(Dp1) && !Sinbounds(Dp2)) {
		*rf = Dp1;
		return;
	}
	ptr = strstr(Soastr(Dp1), Soastr(Dp2));
	if (ptr)
		Dset_sptr(*rf, Dp1.Distr, ptr - Dp1.Sbegin);
}

PDECL(pr_stristr)
{
	char *ptr;

	Tcheck2(F_SPTR, F_SPTR);
	if (!Sinbounds(Dp1) && !Sinbounds(Dp2)) {
		*rf = Dp1;
		return;
	}
	ptr = vtstristr(Soastr(Dp1), Socstr(Dp2));
	if (ptr)
		Dset_sptr(*rf, Dp1.Distr, ptr - Dp1.Sbegin);
}

PDECL(pr_strupr)
{
	char *s;

	Tcheck1(F_SPTR);
	if (Sinbounds(Dp)) {
		isolate(Dp.Distr);
		for (s = Dp.Sbegin; *s; s++)
			*s = ucase(*s);
	}
	*rf = Dp;
}

PDECL(pr_strlwr)
{
	char *s;

	Tcheck1(F_SPTR);
	if (Sinbounds(Dp)) {
		isolate(Dp.Distr);
		for (s = Dp.Sbegin; *s; s++)
			*s = lcase(*s);
	}
	*rf = Dp;
}

PDECL(pr_strlen)
{
	Tcheck1(F_SPTR);
	Dset_int(*rf, Solen(Dp));
}

PDECL(pr_wrap)
{
	char *s, *ptr;
	int l, margin, indent, i;

	Tcheckgen(argc < 2 || T1 != F_SPTR || T2 != F_INT || argc >= 3
		  && T3 != F_INT || argc == 4 && T4 != F_INT || argc > 4);
	s = Soastr(Dp1);
	l = Solen(Dp1);
	margin = argc == 4 ? Int2 - Int4 : Int2;
	indent = argc >= 3 ? Int3 : 0;
	isolate(&wrapbuf);
	s_term(&wrapbuf.rs->str, 0);
	Dset_sptr(*rf, istr_rs(wrapbuf.rs), 0);
	if (margin < 0 || Int2 < indent || !l) {
		    s_add(&wrapbuf.rs->str, '\n');
		    return;
	}
	while (l > margin) {
		ptr = vtstrnrchr(s, ' ', margin);
		i = (ptr && ptr - s > margin / 2) ? ptr - s : margin;
		s_cat(&wrapbuf.rs->str, cstr_sl(s, i));
		s_fadd(&wrapbuf.rs->str, '\n');
		s += i;
		l -= i;
		for (; *s == ' '; s++, l--);
		if (*s) {
			for (i = 0; i < indent; i++)
				s_fadd(&wrapbuf.rs->str, ' ');
		}
		margin = Int2 - indent;
	}
	if (l > 0) {
		s_cat(&wrapbuf.rs->str, cstr_sl(s, l));
		s_fadd(&wrapbuf.rs->str, '\n');
	}
	s_nt(&wrapbuf.rs->str);
}

PDECL(pr_ucase)
{
	Tcheck1(F_INT);
	Dset_int(*rf, ucase(Int));
}

PDECL(pr_lcase)
{
	Tcheck1(F_INT);
	Dset_int(*rf, lcase(Int));
}

PDECL(pr_itoa)
{
	Tcheck1(F_INT);
	Dset_sptr(*rf, istr_s(ITOA(Int)), 0);
}

PDECL(pr_atoi)
{
	Tcheck1(F_SPTR);
	Dset_int(*rf, atoi(Soastr(Dp)));
}


⌨️ 快捷键说明

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