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

📄 tpool.c

📁 su 的源代码库
💻 C
字号:
/* Copyright (c) Colorado School of Mines, 2006.*//* All rights reserved.                       */#include	"sftest.h"static char	Serial[128], *S = Serial;#if __STD_Cssize_t writef(Sfio_t* f, const Void_t* buf, size_t n, Sfdisc_t* disc)#elsessize_t writef(f, buf, n, disc)Sfio_t*		f;Void_t*		buf;size_t		n;Sfdisc_t*	disc;#endif{	memcpy((Void_t*)S,buf,n);	S += n;	return n;}Sfdisc_t	Serialdc = {NIL(Sfread_f), writef, NIL(Sfseek_f), NIL(Sfexcept_f) };MAIN(){	int	i, n, on;	char	*s, *os, *s1, *s2, *s3;	char	poolbuf[1024];	Sfio_t	*f1, *f2, *f3, *f4;	if(!(f1 = sfopen((Sfio_t*)0,tstfile(0),"w+")) ||	   !(f2 = sfopen((Sfio_t*)0,tstfile(1),"w"))  ||	   !(f3 = sfopen((Sfio_t*)0,tstfile(2),"w")))		terror("Opening files\n");	if(!(f4 = sfopen((Sfio_t*)0,tstfile(0),"r+")) )		terror("Opening file to read\n");	sfungetc(f1,'a');	sfungetc(f4,'b');	sfpool(f1,f4,0);	sfungetc(f1,'a');	sfpool(f1,NIL(Sfio_t*),0);	sfsetbuf(f2,poolbuf,sizeof(poolbuf));	sfsetbuf(f3,poolbuf,sizeof(poolbuf));	if(!sfpool(f2,f3,0) )		terror("Setting pool\n");	os = "1234567890\n";	on = strlen(os);	for(i = 0; i < 100; ++i)		if(sfputr(f1,os,-1) < 0)			terror("Writing data\n");	sfseek(f1,(Sfoff_t)0,0);	for(i = 0; i < 100; ++i)	{	if(!(s = sfgetr(f1,'\n',0)) || (n = sfvalue(f1)) != on)			terror("Reading data\n");		if(sfwrite(f2,s,n) != n)			terror("Writing1\n");		if(sfwrite(f3,s,n) != n)			terror("Writing2\n");	}	/* see if data matches */	if(!(f1 = sfopen(f1, tstfile(0), "r")) ||	   !(f2 = sfopen(f2, tstfile(1), "r")) ||	   !(f3 = sfopen(f3, tstfile(2), "r")) )		terror("sfopen for file comparison\n");	if(sfsize(f1) != sfsize(f2) || sfsize(f2) != sfsize(f3))		terror("Files don't match sizes");	n = (int)sfsize(f1);	if(!(s1 = sfreserve(f1,n,0)) ||	   !(s2 = sfreserve(f2,n,0)) ||	   !(s3 = sfreserve(f3,n,0)) )		terror("Fail reserving data");	if(memcmp(s1,s2,n) != 0 || memcmp(s2,s3,n) != 0)		terror("Data do not match");	sfclose(f1);	sfclose(f2);	sfclose(f3);	f1 = sfstdout; f2 = sfstderr;	sfdisc(sfstdout,&Serialdc);	sfdisc(sfstderr,&Serialdc);	sfset(sfstdout,SF_LINE,0);	sfset(sfstderr,SF_LINE,0);	if(sfpool(sfstdout,sfstderr,0) != sfstderr )		terror("sfpool1\n");	sfputc(sfstdout,'1');	sfputc(sfstderr,'2');	sfputc(sfstdout,'3');	sfputc(sfstderr,'4');	sfsync(sfstderr);	if(strcmp(Serial,"1234") != 0)		terror("Pool not serializing output\n");	sfdisc(sfstdout,NIL(Sfdisc_t*));	sfdisc(sfstderr,NIL(Sfdisc_t*));	sfclose(sfstdout);	if(!(f1 = sfopen((Sfio_t*)0,tstfile(0),"r")))		terror("sfopen\n");	if(!sfpool(f1,sfstderr,0) )		terror("sfpool2\n");	if(!(f1 = sfopen(NIL(Sfio_t*), tstfile(0), "w+")) ||	   !(f2 = sfopen(NIL(Sfio_t*), tstfile(1), "w+")) ||	   !(f3 = sfopen(NIL(Sfio_t*), tstfile(2), "w+")) )		terror("sfopen3\n");	if(sfpool(f1,f2,SF_SHARE) != f2 || sfpool(f3,f2,SF_SHARE) != f2 )		terror("sfpool3\n");	if(sfputc(f3,'x') < 0)		terror("sfputc to f3\n");	if(sfputc(f2,'y') < 0)		terror("sfputc to f2\n");	if(sfputc(f1,'z') < 0)		terror("sfputc to f1\n");	if(sfseek(f1,(Sfoff_t)0,0) != 0)		terror("sfseek failed on f1\n");	if(!(s = sfreserve(f1,3,1)) || sfvalue(f1) != 3)		terror("sfreserve failed on f1\n");	if(memcmp(s,"xyz",3) != 0)		terror("Wrong data\n");	if((os = sfreserve(f2,-1,0)) )		terror("sfreserve should have failed on f2\n");	if(sfpool(NIL(Sfio_t*),f2,0) != f1)		terror("Didn't get right pool head for f2\n");	if(sfread(f1,s,3) != 3)		terror("Wrong read on f1\n");	if(!sfpool(f3,NIL(Sfio_t*),0) )		terror("sfpool to delete f3\n");	if(sfpool(f1,NIL(Sfio_t*),0) != f1 )		terror("sfpool to delete f1\n");	if(!(f1 = sfopen(NIL(Sfio_t*), tstfile(0), "w+")) ||	   !(f2 = sfopen(NIL(Sfio_t*), tstfile(1), "w")) )		terror("sfopen4\n");	sfputc(f1,'a');	sfputc(f1,'b');	sfputc(f1,'c');	sfset(f1,SF_WRITE,0);	/* off write mode */	if(sfpool(f1,f2,SF_SHARE) )		terror("sfpool should fail pooling read+write streams\n");	if(sfseek(f1,(Sfoff_t)0,0) != (Sfoff_t)0)		terror("sfseek failed\n");	if(!(s = sfreserve(f1,3,1)) || memcmp(s,"abc",3) != 0)		terror("Can't get data from f1\n");	TSTEXIT(0);}

⌨️ 快捷键说明

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