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

📄 tdisc.c

📁 su 的源代码库
💻 C
字号:
/* Copyright (c) Colorado School of Mines, 2006.*//* All rights reserved.                       */#include	"sftest.h"#if __STD_Cssize_t upper(Sfio_t* f, Void_t* buf, size_t n, Sfdisc_t* disc)#elsessize_t upper(f,buf,n,disc)Sfio_t*		f;Void_t*		buf;size_t		n;Sfdisc_t*	disc;#endif{	size_t	i;	char*	s = (char*)buf;	if(sfgetc(f) >= 0)		terror("Stream should be locked\n");	if((n = sfrd(f,buf,n,disc)) <= 0)		return n;	for(i = 0; i < n; ++i)		if(s[i] >= 'a' && s[i] <= 'z')			s[i] = (s[i]-'a') + 'A';	return n;}#if __STD_Cssize_t wupper(Sfio_t* f, const Void_t* buf, size_t n, Sfdisc_t* disc)#elsessize_t wupper(f,buf,n,disc)Sfio_t*		f;Void_t*		buf;size_t		n;Sfdisc_t*	disc;#endif{	size_t	i;	char*	s = (char*)buf;	if(sfputc(f,0) >= 0)		terror("Stream should be locked2\n");	for(i = 0; i < n; ++i)		if(s[i] >= 'a' && s[i] <= 'z')			s[i] = (s[i]-'a') + 'A';	return sfwr(f,buf,n,disc);}#if __STD_Cssize_t lower(Sfio_t* f, Void_t* buf, size_t n, Sfdisc_t* disc)#elsessize_t lower(f,buf,n,disc)Sfio_t*		f;Void_t*		buf;size_t		n;Sfdisc_t*	disc;#endif{	size_t	i;	char*	s = (char*)buf;	if(sfgetc(f) >= 0)		terror("Stream should be locked\n");	if((n = sfrd(f,buf,n,disc)) <= 0)		return n;	for(i = 0; i < n; ++i)		if(s[i] >= 'A' && s[i] <= 'Z')			s[i] = (s[i]-'A') + 'a';	return n;}#if __STD_Cssize_t once(Sfio_t* f, Void_t* buf, size_t n, Sfdisc_t* disc)#elsessize_t once(f,buf,n,disc)Sfio_t*		f;Void_t*		buf;size_t		n;Sfdisc_t*	disc;#endif{	static int	called = 0;	if(!called)	{	called = 1;		strcpy(buf,"123456");		return 6;	}	else	{	terror("Discipline is called twice\n");		return -1;	}}static char	External[128], *Enext = External;#if __STD_Cssize_t external(Sfio_t* f, const Void_t* buf, size_t n, Sfdisc_t* disc)#elsessize_t external(f,buf,n,disc)Sfio_t*		f;Void_t*		buf;size_t		n;Sfdisc_t*	disc;#endif{	memcpy(Enext,buf,n);	Enext += n;	return n;}Sfdisc_t Wdisc = {(Sfread_f)0, wupper, (Sfseek_f)0, (Sfexcept_f)0, (Sfdisc_t*)0};Sfdisc_t Udisc = {upper, wupper, (Sfseek_f)0, (Sfexcept_f)0, (Sfdisc_t*)0};Sfdisc_t Ldisc = {lower, (Sfwrite_f)0, (Sfseek_f)0, (Sfexcept_f)0, (Sfdisc_t*)0};Sfdisc_t Odisc = {once, (Sfwrite_f)0, (Sfseek_f)0, (Sfexcept_f)0, (Sfdisc_t*)0};Sfdisc_t Edisc = {(Sfread_f)0, external, (Sfseek_f)0, (Sfexcept_f)0, (Sfdisc_t*)0};MAIN(){	Sfio_t	*f, *fs;	char	*l, *u, *s;	int	n, r;	int	flags;	char	buf[1024], low[64], up[64];	sfsetbuf(sfstdin,buf,sizeof(buf));	flags = sfset(sfstdin,0,0);	sfdisc(sfstdin,&Ldisc);	if(sfset(sfstdin,0,0) != flags)		terror("Flags changed after discipline setting\n");	l = low;	strcpy(l, "abcdefghijklmnopqrstuvwxyz");	u = up;	strcpy(u, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");	n = strlen(l);	if(!(f = sfopen(NIL(Sfio_t*), tstfile(0),"w+")))		terror("Creating temp file\n");	if((r = sfwrite(f,l,n)) != n)		terror("Writing data %d\n",r);	sfsync(f);	sfseek(f,(Sfoff_t)0,0);	sfdisc(f,&Udisc);	if(!(s = sfreserve(f,n,0)) )		terror("Reading string1\n");	if(strncmp(s,u,n) != 0)	{	s[n-1] = 0;		terror("Input1=%s, Expect=%s\n",s,u);	}	sfseek(f,(Sfoff_t)0,0);	sfdisc(f,&Ldisc);	if(!(s = sfreserve(f,n,0)) )		terror("Reading string2\n");	if(strncmp(s,l,n) != 0)	{	s[n-1] = 0;		terror("Input2=%s, Expect=%s\n",s,l);	}	if(!(f = sfopen(NIL(Sfio_t*), tstfile(0), "w+")) )		terror("Opening file\n");	sfdisc(f,&Wdisc);	if(sfputr(f,low,'\n') < 0)		terror("Writing data\n");	if(sfseek(f,(Sfoff_t)0,0) != 0)		terror("Seeking\n");	if(!(s = sfgetr(f,'\n',1)))		terror("sfgetr\n");	if(strcmp(s,up) != 0)		terror("Bad data\n");	/* read-once discipline */	if(!(f = sfopen(NIL(Sfio_t*), tstfile(0),"r")) )		terror("Opening file\n");	sfdisc(f,&Odisc);	if(!(s = sfreserve(f,SF_UNBOUND,1)) )		terror("Sfreserve failed1\n");	if(sfvalue(f) != 6)		terror("Wrong reserved length1\n");	sfread(f,s,3);	if(!(fs = sfopen(NIL(Sfio_t*),"abcdef","s")) )		terror("String open failed\n");	sfstack(f,fs);	if(!(s = sfreserve(f,SF_UNBOUND,1)) )		terror("Sfreserve failed2\n");	if(sfvalue(f) != 6)		terror("Wrong reserved length2\n");	sfread(f,s,6);	if(!(s = sfreserve(f,SF_UNBOUND,1)) )		terror("sfreserve failed 3\n");	if(sfvalue(f) != 3)		terror("Wrong reserved length3\n");	if(!(f = sfopen(NIL(Sfio_t*), tstfile(0),"w")) )		terror("Opening file to write\n");	sfdisc(f,&Edisc);	if(sfwrite(f, "one", 3) != 3)		terror("Bad sfwrite\n");	if(sfwr(f, "two", 4, NIL(Sfdisc_t*)) != 4)		terror("Bad sfwr\n");	if(strcmp(External,"onetwo") != 0)		terror("Bad call of sfwr\n");	TSTEXIT(0);}

⌨️ 快捷键说明

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