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

📄 tprintf.c

📁 su 的源代码库
💻 C
字号:
/* Copyright (c) Colorado School of Mines, 2006.*//* All rights reserved.                       */#include	"sftest.h"typedef struct _coord_{	int	x;	int	y;} Coord_t;Coord_t	Coord;#if __STD_Cint coordprint(Sfio_t* f, Void_t* v, Sffmt_t* fe)#elseint coordprint(f, v, fe)Sfio_t*		f;Void_t*		v;Sffmt_t*	fe;#endif{	char		type[128];	Coord_t*	cp;	char*		s;	if(fe->fmt != 'c')		return -1;	cp = va_arg(fe->args,Coord_t*);	memcpy(type,fe->t_str,fe->n_str); type[fe->n_str] = 0;	s = *((char**)v) = sfprints(type,cp->x,cp->y);	fe->fmt = 's';	fe->size = strlen(s);	fe->flags |= SFFMT_VALUE;	return 0;}typedef union Value_u{	unsigned char	c;	short		h;	int		i;	long		l;	Sflong_t	ll;	Sfdouble_t	ld;	double		d;	float		f;	char		*s;	int		*ip;	char		**p;} Value_t;#if __STD_Cint nulprint(Sfio_t* f, Void_t* val, Sffmt_t* fe)#elseint nulprint(f, val, fe)Sfio_t*		f;Void_t*		val;Sffmt_t*	fe;#endif{	if(fe->fmt == 'Z')	{	fe->fmt = 'c';		fe->size = -1;		fe->base = -1;		fe->flags &= ~SFFMT_LONG;		fe->flags |= SFFMT_VALUE;		((Value_t*)val)->l = 0x04050607;		((Value_t*)val)->c = 0;	}	else if(fe->fmt == 'Y')	{	fe->fmt = 'c';		fe->size = -1;		fe->base = ':';		fe->flags &= ~SFFMT_LONG;		fe->flags |= SFFMT_VALUE;		((Value_t*)val)->s = "abc";	}	return 0;}static int	OXcount;static char*	OXstr = "abc";#if __STD_Cint DOXSprint(Sfio_t* f, Void_t* v, Sffmt_t* fe)#elseint DOXSprint(f, v, fe)Sfio_t*		f;Void_t*		v;Sffmt_t*	fe;#endif{	OXcount += 1;	switch(fe->fmt)	{	case 'd' :		*((int*)v) = 10;		fe->flags |= SFFMT_VALUE;		return 0;	case 'O' :		fe->fmt = 'o';		*((int*)v) = 11;		fe->flags |= SFFMT_VALUE;		return 0;	case 'X' :		fe->fmt = 'x';		*((int*)v) = 12;		fe->flags |= SFFMT_VALUE;		return 0;	case 's':		*((char**)v) = OXstr;		fe->flags |= SFFMT_VALUE;		return 0;	}	return 0;}#if __STD_Cint abprint(Sfio_t* f, Void_t* v, Sffmt_t* fe)#elseint abprint(f, v, fe)Sfio_t*		f;Void_t*		v;Sffmt_t*	fe;#endif{	switch(fe->fmt)	{	case 'a' :		fe->fmt = 'u';		return 0;	case 'b' :		fe->fmt = 'd';		return 0;	case 'y' : /* test return value of extension function */		fe->size = 10;		fe->fmt = 's';		return 0;	case 'Y' : /* terminate format processing */	default :		return -1;	}}#if __STD_Cint intarg(Sfio_t* f, Void_t* val, Sffmt_t* fe)#elseint intarg(f, val, fe)Sfio_t*		f;Void_t*		val;Sffmt_t*	fe;#endif{	static int	i = 1;	*((int*)val) = i++;	fe->flags |= SFFMT_VALUE;	return 0;}#if __STD_Cint shortarg(Sfio_t* f, Void_t* val, Sffmt_t* fe)#elseint shortarg(f, val, fe)Sfio_t*		f;Void_t*		val;Sffmt_t*	fe;#endif{	static short	i = -2;	*((short*)val) = i++;	fe->size = sizeof(short);	fe->flags |= SFFMT_VALUE;	return 0;}#if __STD_Cint transarg(Sfio_t* f, Void_t* val, Sffmt_t* fe)#elseint transarg(f, val, fe)Sfio_t*		f;Void_t*		val;Sffmt_t*	fe;#endif{	switch(fe->fmt)	{ case 'D' :		fe->fmt = 'd'; return 0;	  case 'O' :		fe->fmt = 'o'; return 0;	  case 'F' :		fe->fmt = 'f'; return 0;	  case 'S' :		fe->fmt = 's'; return 0;	  case 'C' :		fe->fmt = 'c'; return 0;	  default : return -1;	}}#if __STD_Cvoid stkprint(char* buf, int n, char* form, ...)#elsevoid stkprint(buf,n,form,va_alist)char*	buf;int	n;char*	form;va_dcl#endif{	va_list	args;	Sffmt_t	fe;#if __STD_C	va_start(args,form);#else	va_start(args);#endif	fe.form = form;	va_copy(fe.args,args);	fe.extf = NIL(Sffmtext_f);	fe.eventf = NIL(Sffmtevent_f);	sfsprintf(buf,n,"%! %d %d",&fe,3,4);	va_end(args);}MAIN(){	char	buf1[1024], buf2[1024], *list[4], *s;	double	x=0.0051;	int	i, j;	long	k;	Sffmt_t	fe;	Sfio_t*	f;	f = sfopen(NIL(Sfio_t*), tstfile(0), "w+");	sfsetbuf(f,buf1,10);	sfprintf(f,"%40s\n","0123456789");	sfsprintf(buf2,sizeof(buf2),"%40s","0123456789");	sfseek(f,(Sfoff_t)0,0);	if(!(s = sfgetr(f,'\n',1)) )		terror("Failed getting string\n");	if(strcmp(s,buf2) != 0)		terror("Failed formatting %%s\n");	sfsprintf(buf1,sizeof(buf1),"%4d %4o %4x", 10, 11, 11);	sfsprintf(buf2,sizeof(buf2),"%2$4d %1$4o %1$4x", 11, 10);	if(strcmp(buf1,buf2) != 0)		terror("Failed testing $position\n");	sfsprintf(buf1,sizeof(buf1),"%d %1$d %.*d %1$d", 10, 5, 300);	sfsprintf(buf2,sizeof(buf2),"%d %1$d %3$.*2$d %1$d", 10, 5, 300);	if(strcmp(buf1,buf2) != 0)		terror("Failed testing $position with precision\n");	fe.version = SFIO_VERSION;	fe.form = NIL(char*);	fe.extf = DOXSprint;	fe.eventf = NIL(Sffmtevent_f);	sfsprintf(buf1,sizeof(buf1),"%4d %4o %4x %4o %4x %s", 10, 11, 12, 11, 10, "abc");	sfsprintf(buf2,sizeof(buf2),"%!%2$4d %3$4O %4$4X %3$4O %2$4x %5$s", &fe);	if(strcmp(buf1,buf2) != 0)		terror("Failed testing $position2\n");	if(OXcount != 4)		terror("Failed OXprint called wrong number of times %d\n",OXcount);	sfsprintf(buf1,sizeof(buf1),"%6.2f",x);	if(strcmp(buf1,"  0.01") != 0)		terror("%%f rounding wrong\n");	fe.version = SFIO_VERSION;	fe.form = NIL(char*);	fe.extf = abprint;	fe.eventf = NIL(Sffmtevent_f);	sfsprintf(buf1,sizeof(buf1),"%%sX%%d%..4u %..4d9876543210",-1,-1);	sfsprintf(buf2,sizeof(buf2),"%!%%sX%%d%..4a %..4b%y%Yxxx",			&fe, -1, -1, "9876543210yyyy" );	if(strcmp(buf1,buf2) != 0)		terror("%%!: Extension function failed1\n");	fe.form = NIL(char*);	fe.extf = intarg;	sfsprintf(buf1,sizeof(buf1),"%d %d%",1,2);	sfsprintf(buf2,sizeof(buf2),"%!%d %d%",&fe);	if(strcmp(buf1,buf2) != 0)		terror("%%!: Extension function failed2\n");	fe.form = NIL(char*);	sfsprintf(buf1,sizeof(buf1),"%d %d%%",3,4);	sfsprintf(buf2,sizeof(buf2),"%!%d %d%%",&fe);	if(strcmp(buf1,buf2) != 0)		terror("%%!: Extension function failed3\n");	fe.form = NIL(char*);	fe.extf = shortarg;	sfsprintf(buf1,sizeof(buf1),"%hu %ho %hi %hu %ho %hd", -2, -1, 0, 1, 2, 3);	sfsprintf(buf2,sizeof(buf2),"%!%u %o %i %u %o %d",&fe);	if(strcmp(buf1,buf2) != 0)		terror("%%!: Extension function failed4\n");	/* test extf translation */	fe.form = NIL(char*);	fe.extf = transarg;	sfsprintf(buf1,sizeof(buf1),"%d %o %f %s %c", -1, -1, -1., "s", 'c');	sfsprintf(buf2,sizeof(buf2),"%!%D %O %F %S %C",&fe, -1, -1, -1., "s", 'c');	if(strcmp(buf1,buf2) != 0)		terror("%%!: Extension function failed5\n");	k = 1234567890;	sfsprintf(buf1,sizeof(buf1),"%I*d",sizeof(k),k);	if(strcmp(buf1,"1234567890") != 0)		terror("%%I*d failed\n");	Coord.x = 5;	Coord.y = 7;	sfsprintf(buf1,sizeof(buf1),"%d %d",Coord.x,Coord.y);	fe.form = NIL(char*);	fe.extf = coordprint;	sfsprintf(buf2,sizeof(buf2),"%!%(%d %d)c",&fe,&Coord);	if(strcmp(buf1,buf2) != 0)		terror("%%()c `%s' != `%s'\n", buf1, buf2);	fe.form = NIL(char*);	fe.extf = nulprint;	buf2[0] = buf2[1] = buf2[2] = buf2[3] = buf2[4] = 3;	sfsprintf(buf2,sizeof(buf2),"%!\001%Z\002",&fe);	if(buf2[0]!=1||buf2[1]!=0||buf2[2]!=2||buf2[3]!=0||buf2[4]!=3)		terror("%%Z <1,0,2,0,3> != <%o,%o,%o,%o,%o>\n",			buf2[0], buf2[1], buf2[2], buf2[3], buf2[4]);	fe.form = NIL(char*);	fe.extf = nulprint;	buf2[0] = buf2[1] = buf2[2] = buf2[3] = buf2[4] = 3;	sfsprintf(buf2,sizeof(buf2),"%!%c%Z%c",&fe,1,2);	if(buf2[0]!=1||buf2[1]!=0||buf2[2]!=2||buf2[3]!=0||buf2[4]!=3)		terror("%%Z <1,0,2,0,3> != <%o,%o,%o,%o,%o>\n",			buf2[0], buf2[1], buf2[2], buf2[3], buf2[4]);	fe.form = NIL(char*);	fe.extf = nulprint;	sfsprintf(buf2,sizeof(buf2),"%!%Y",&fe);	if(strcmp(buf2,"a:b:c"))		terror("%%Y a:b:c != %s\n", buf2);	sfsprintf(buf1,sizeof(buf1),"%d %d %d %d",1,2,3,4);	stkprint(buf2,sizeof(buf2),"%d %d",1,2);	if(strcmp(buf1,buf2) != 0)		terror("%%!: Stack function failed\n");	sfsprintf(buf1,sizeof(buf1),"% +G",-1.2345);	sfsprintf(buf2,sizeof(buf2),"-1.2345");	if(strcmp(buf1,buf2) != 0)		terror("Failed %% +G test\n");	if(sizeof(int) == 4 &&  sizeof(short) == 2)	{	char* s = sfprints("%hx",0xffffffff);		if(!s || strcmp(s,"ffff") != 0)			terror("Failed %%hx test\n");		s = sfprints("%I2x",0xffffffff);		if(!s || strcmp(s,"ffff") != 0)			terror("Failed %%I2x test\n");	}	if(sizeof(int) == 4 &&  sizeof(char) == 1)	{	char* s = sfprints("%hhx",0xffffffff);		if(!s || strcmp(s,"ff") != 0)			terror("Failed %%hhx test\n");		s = sfprints("%I1x",0xffffffff);		if(!s || strcmp(s,"ff") != 0)			terror("Failed %%I1x test\n");	}	sfsprintf(buf1,sizeof(buf1),"%#..16d",-0xabc);	if(strcmp(buf1,"-16#abc") != 0)		terror("Failed %%..16d test\n");	sfsprintf(buf1,sizeof(buf1),"%#..16lu",(long)0xc2c01576);	if(strcmp(buf1,"16#c2c01576") != 0)		terror("Failed %%..16u test\n");	sfsprintf(buf1,sizeof(buf1),"%0#4o",077);	if(strcmp(buf1,"0077") != 0)		terror("Failed %%0#4o test\n");	sfsprintf(buf1,sizeof(buf1),"%0#4x",0xc);	if(strcmp(buf1,"0x000c") != 0)		terror("Failed %%0#4x test\n");	sfsprintf(buf1,sizeof(buf1),"%c%c%c",'a','b','c');	if(strcmp(buf1,"abc") != 0)		terror("Failed %%c test\n");	sfsprintf(buf1,sizeof(buf1),"%.4c",'a');	if(strcmp(buf1,"aaaa") != 0)		terror("Failed %%.4c test\n");	sfsprintf(buf1,sizeof(buf1),"%hd%c%hd%ld",(short)1,'1',(short)1,1L);	if(strcmp(buf1,"1111") != 0)		terror("Failed %%hd test\n");	sfsprintf(buf1,sizeof(buf1),"%10.5E",(double)0.0000625);	if(strcmp(buf1,"6.25000E-05") != 0)		terror("Failed %%E test\n");	sfsprintf(buf1,sizeof(buf1),"%10.5f",(double)0.0000625);	if(strcmp(buf1,"   0.00006") != 0)		terror("Failed %%f test\n");	sfsprintf(buf1,sizeof(buf1),"%10.5G",(double)0.0000625);	if(strcmp(buf1,"  6.25E-05") != 0)		terror("Failed %%G test\n");	list[0] = "0";	list[1] = "1";	list[2] = "2";	list[3] = 0;	sfsprintf(buf1,sizeof(buf1),"%..*s", ',', list);	if(strcmp(buf1,"0,1,2") != 0)		terror("Failed %%..*s test\n");	sfsprintf(buf1,sizeof(buf1),"%.2.*c", ',', "012");	if(strcmp(buf1,"00,11,22") != 0)		terror("Failed %%..*c test\n");	sfsprintf(buf1,sizeof(buf1),"A%.0dB", 0);	if(strcmp(buf1,"AB") != 0)		terror("Failed precision+0 test\n");	sfsprintf(buf1,sizeof(buf1),"A%.0dB", 1);	if(strcmp(buf1,"A1B") != 0)		terror("Failed precision+1 test\n");	sfsprintf(buf1,sizeof(buf1),"A%4.0dB", 12345);	if(strcmp(buf1,"A12345B") != 0)		terror("Failed exceeding width test\n");	sfsprintf(buf1,sizeof(buf1),"A%3dB",33);	if(strcmp(buf1,"A 33B") != 0)		terror("Failed justification test\n");	sfsprintf(buf1,sizeof(buf1),"A%04dB",-1);	if(strcmp(buf1,"A-001B") != 0)		terror("Failed zero filling test\n");	sfsprintf(buf1,sizeof(buf1),"A%+04dB",1);	if(strcmp(buf1,"A+001B") != 0)		terror("Failed signed and zero-filled test\n");	sfsprintf(buf1,sizeof(buf1),"A% .0dB", -1);	if(strcmp(buf1,"A-1B") != 0)		terror("Failed blank and precision test\n");	sfsprintf(buf1,sizeof(buf1),"A%+ .0dB", 1);	if(strcmp(buf1,"A+1B") != 0)		terror("Failed +,blank and precision test\n");	sfsprintf(buf1,sizeof(buf1),"A%010.2fB", 1.2);	if(strcmp(buf1,"A0000001.20B") != 0)		terror("Failed floating point and zero-filled test\n");	sfsprintf(buf1,sizeof(buf1),"A%-010.2fB", 1.2);	if(strcmp(buf1,"A1.20      B") != 0)		terror("Failed floating point and left justification test\n");	sfsprintf(buf1,sizeof(buf1),"A%-#XB", 0xab);	if(strcmp(buf1,"A0XABB") != 0)		terror("Failed %%-#X conversion test\n");#if !_ast_intmax_long	{ Sflong_t	ll;	  char		buf[128];	  char*		s = sfprints("%#..16llu",~((Sflong_t)0));	  sfsscanf(s,"%lli", &ll);	  if(ll != (~((Sflong_t)0)) )		terror("Failed inverting printf/scanf Sflong_t\n");	  s = sfprints("%#..18lld",~((Sflong_t)0));	  sfsscanf(s,"%lli", &ll);	  if(ll != (~((Sflong_t)0)) )		terror("Failed inverting printf/scanf Sflong_t\n");	  s = sfprints("%#..lli",~((Sflong_t)0));	  sfsscanf(s,"%lli", &ll);	  if(ll != (~((Sflong_t)0)) )		terror("Failed inverting printf/scanf Sflong_t\n");	  sfsprintf(buf,sizeof(buf), "%llu", (~((Sflong_t)0)/2) );	  s = sfprints("%Iu", (~((Sflong_t)0)/2) );	  if(strcmp(buf,s) != 0)		terror("Failed conversion with I flag\n");	  if(sizeof(Sflong_t)*8 == 64)	  {	s = sfprints("%I64u",(~((Sflong_t)0)/2) );	  	if(strcmp(buf,s) != 0)			terror("Failed conversion with I64 flag\n");	  }	}#endif	i = (int)(~(~((unsigned int)0) >> 1));	s = sfprints("%d",i);	j = atoi(s);	if(i != j)		terror("Failed converting highbit\n");		for(i = -10000; i < 10000; i += 123)	{	s = sfprints("%d",i);		j = atoi(s);		if(j != i)			terror("Failed integer conversion\n");	}	/* test I flag for strings */	{ char	*ls[3];	  ls[0] = "0123456789";	  ls[1] = "abcdefghij";	  ls[2] = 0;	  s = sfprints("%I5..*s", 0, ls);	  if(strcmp(s, "01234abcde") != 0)		terror("Failed I flag with %%s\n");	}	/* test justification */	sfsprintf(buf1,sizeof(buf1),"%-10.5s","abcdefghij");	sfsprintf(buf2,sizeof(buf2),"%*.5s",-10,"abcdefghij");	if(strcmp(buf1,buf2) != 0)		terror("Left-justification is wrong\n");	sfsprintf(buf1,sizeof(buf1),"%10.5s","abcdefghij");	sfsprintf(buf2,sizeof(buf2),"%*.5s",10,"abcdefghij");	if(strcmp(buf1,buf2) != 0)		terror("Justification is wrong\n");	/* testing x/open compliant with respect to precision */	sfsprintf(buf1, sizeof(buf1),		"%.d %.hi %.lo %.f %.e %.g %.g %.g %.g %.g %.s %.d %.hi %.lo|",		1345,		1234,		1234567890,		321.7654321,		321.7654321,		-0.01,		0.01,		1e-5,		1.4,		-1.4,		"test-string",		0,		0,		0L);	if(strcmp(buf1,"1345 1234 11145401322 322 3e+02 -0.01 0.01 1e-05 1 -1    |") )		terror("Precision not set to zero as required after a dot");	/* test %#c to print C-style characters */	sfsprintf(buf1, sizeof(buf1), "%#.2c%#.2c", '\n', 255);	if(strcmp(buf1, "\\n\\n\\377\\377") != 0)		terror("%%#c formatting failed");	/* test printing of signed integer of length 1 */#if defined(__STDC__)	{	signed char	c = -128;		sfsprintf(buf1, sizeof(buf1), "%I1d", c);		if(strcmp(buf1, "-128") != 0)			terror("%%I1d formatting failed");	}#endif	TSTEXIT(0);}

⌨️ 快捷键说明

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