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

📄 doprnt.c,v

📁 用TCP/IP进行网际互连这本书得源代码,偶得,希望大家喜欢.推荐下载
💻 C,V
字号:
head	1.2;access;symbols;locks	dls:1.2; strict;comment	@ * @;1.2date	97.09.21.19.27.40;	author dls;	state Dist;branches;next	1.1;1.1date	94.05.05.04.25.32;	author dls;	state Old;branches;next	;desc@@1.2log@pre-3e code@text@/* doprnt.c - _doprnt, _prt10, _prtl10, _prt8, _prtl8, _prt16, _prtl16 */#define	MAXSTR	80#define	LOCAL	staticLOCAL	_prt10(), _prtl10(), _prt8(), _prtl8(), _prt16(), _prtl16(), _prt2(),	_prtl2();/*------------------------------------------------------------------------ *  _doprnt --  format and write output using 'func' to write characters *------------------------------------------------------------------------ * *    patched for Sun3 by Shawn Ostermann *            all arguments passed as 4 bytes, long==int * */_doprnt(fmt, args, func, farg)	/* adapted by S. Salisbury, Purdue U.	*/	char	*fmt;		/* Format string for printf		*/	int	*args;		/* Arguments to	printf			*/	int	(*func)();	/* Function to put a character		*/	int	farg;		/* Argument to func			*/{	int	c;	int	i;	int	f;		/* The format character	(comes after %)	*/	char	*str;		/* Running pointer in string		*/	char	string[20];	/* The string str points to this output	*/				/*  from number conversion		*/	int	length;		/* Length of string "str"		*/	char	fill;		/* Fill	character (' ' or '0')		*/	int	leftjust;	/* 0 = right-justified,	else left-just.	*/	int	longflag;	/* != 0	for long numerics - not	used	*/	int	fmax,fmin;	/* Field specifications	% MIN .	MAX s	*/	int	leading;	/* No. of leading/trailing fill	chars.	*/	char	sign;		/* Set to '-' for negative decimals	*/	char	digit1;		/* Offset to add to first numeric digit	*/	for(;;) {		/* Echo characters until '%' or end of fmt string */		while( (c = *fmt++) != '%' ) {			if( c == '\0' )				return;			(*func)(farg,c);		}		/* Echo "...%%..." as '%' */		if( *fmt == '%' ) {			(*func)(farg,*fmt++);			continue;		}		/* Check for "%-..." == Left-justified output */		if (leftjust = ((*fmt=='-') ? 1 : 0) )			fmt++;		/* Allow for zero-filled numeric outputs ("%0...") */		fill = (*fmt=='0') ? *fmt++ : ' ';		/* Allow for minimum field width specifier for %d,u,x,o,c,s*/		/* Also allow %* for variable width (%0* as well)	*/		fmin = 0;		if( *fmt == '*' ) {			fmin = *args++;			++fmt;		}		else while( '0' <= *fmt && *fmt <= '9' ) {			fmin = fmin * 10 + *fmt++ - '0';		}		/* Allow for maximum string width for %s */		fmax = 0;		if( *fmt == '.' ) {			if( *(++fmt) == '*' ) {				fmax = *args++;				++fmt;			}		else while( '0' <= *fmt && *fmt <= '9' ) {			fmax = fmax * 10 + *fmt++ - '0';			}		}		/* Check for the 'l' option to force long numeric */		if( longflag = ((*fmt == 'l') ? 1 : 0) )			fmt++;#ifndef INT_NOT_LONG		longflag = 1;	/* all are 4 bytes on the Sun */#endif								str = string;		if( (f= *fmt++) == '\0' ) {			(*func)(farg,'%');			return;		}		sign = '\0';	/* sign == '-' for negative decimal */		switch( f ) {		    case 'c' :			string[0] = (char) *args;			string[1] = '\0';			fmax = 0;			fill = ' ';			break;		    case 's' :			str = (char *) *args;			fill = ' ';			break;		    case 'D' :			longflag = 1;		    case 'd' :			if (longflag) {				if ( *(long *)args < 0) {					sign = '-';					*(long *)args = -*(long *)args;				}			} else {				if ( *args < 0 ) {					sign = '-';					*args = -*args;				}			}			longflag--;		    case 'U':			longflag++;		    case 'u':			if( longflag ) {				digit1 = '\0';				/* "negative" longs in unsigned format	*/				/* can't be computed with long division	*/				/* convert *args to "positive", digit1	*/				/* = how much to add back afterwards	*/				while(*(long *)args < 0) {					*(long *)args -= 1000000000L;					++digit1;				}				_prtl10(*(long *)args, str);				str[0] += digit1;#ifdef INT_NOT_LONG								++args;#endif							} else				_prt10(*args, str);			fmax = 0;			break;		    case 'O' :			longflag++;		    case 'o' :			if ( longflag ) {				_prtl8(*(long *)args, str);#ifdef INT_NOT_LONG								++args;#endif							} else				_prt8(*args, str);			fmax = 0;			break;		    case 'X' :			longflag++;		    case 'x' :			if( longflag ) {				_prtl16(*(long *)args, str);#ifdef INT_NOT_LONG								++args;#endif							} else				_prt16(*args, str);			fmax = 0;			break;		    case 'B' :			longflag++;		    case 'b' :			if( longflag ) {				_prtl2(*(long *)args, str);#ifdef INT_NOT_LONG								++args;#endif							} else				_prt2(*args, str);			fmax = 0;			break;		    default :			(*func)(farg,f);			break;		}		args++;		for(length = 0; str[length] != '\0'; length++)			;		if ( fmin > MAXSTR || fmin < 0 )			fmin = 0;		if ( fmax > MAXSTR || fmax < 0 )			fmax = 0;		leading = 0;		if ( fmax != 0 || fmin != 0 ) {			if ( fmax != 0 )				if ( length > fmax )					length = fmax;			if ( fmin != 0 )				leading = fmin - length;			if ( sign == '-' )				--leading;		}		if( sign == '-' && fill == '0' )			(*func)(farg,sign);		if( leftjust == 0 )			for( i = 0; i < leading; i++ )				(*func)(farg,fill);		if( sign == '-' && fill == ' ' )			(*func)(farg,sign);		for( i = 0 ; i < length ; i++ )			(*func)(farg,str[i]);		if ( leftjust != 0 )			for( i = 0; i < leading; i++ )				(*func)(farg,fill);	}}LOCAL	_prt10(num,str)	unsigned int num;	char	*str;{	int	i;	char	c, temp[6];	temp[0]	= '\0';	for(i = 1; i <= 5; i++)  {		temp[i] = num % 10 + '0';		num /= 10;	}	for(i =	5; temp[i] == '0'; i--);	if( i == 0 )		i++;	while( i >= 0 )		*str++ = temp[i--];}LOCAL	_prtl10(num,str)	long	num;	char	*str;{	int	i;	char	c, temp[11];	temp[0]	= '\0';	for(i = 1; i <= 10; i++)  {		temp[i] = num % 10 + '0';		num /= 10;	}	for(i = 10; temp[i] == '0'; i--);	if( i == 0 )		i++;	while( i >= 0 )		*str++ = temp[i--];}LOCAL	_prt8(num,str)	unsigned int num;	char	*str;{	int	i;	char	c;	char	temp[7];	temp[0]	= '\0';	for(i = 1; i <= 6; i++)  {		temp[i]	= (num & 07) + '0';		num = (num >> 3) & 0037777;	}	temp[6] &= '1';	for(i = 6; temp[i] == '0'; i--);	if( i == 0 )		i++;	while( i >= 0 )		*str++ = temp[i--];}LOCAL	_prtl8(num,str)	long	num;	char	*str;{	int	i;	char	c, temp[12];	temp[0]	= '\0';	for(i = 1; i <= 11; i++)  {		temp[i]	= (num & 07) + '0';		num = num >> 3;	}	temp[11] &= '3';	for(i = 11; temp[i] == '0'; i--);	if( i == 0 )		i++;	while( i >= 0 )		*str++ = temp[i--];}LOCAL	_prt16(num,str)	unsigned int num;	char	*str;{	int	i;	char	c, temp[5];	temp[0] = '\0';	for(i = 1; i <= 4; i++)  {		temp[i] = "0123456789abcdef"[num & 0x0f];		num = num >> 4;	}	for(i = 4; temp[i] == '0'; i--);	if( i == 0 )		i++;	while( i >= 0 )		*str++ = temp[i--];}LOCAL	_prtl16(num,str)	long	num;	char	*str;{	int	i;	char	c, temp[9];	temp[0] = '\0';	for(i = 1; i <= 8; i++)  {		temp[i] = "0123456789abcdef"[num & 0x0f];		num = num >> 4;	}	for(i = 8; temp[i] == '0'; i--);	if( i == 0 )		i++;	while( i >= 0 )		*str++ = temp[i--];}LOCAL	_prt2(num,str)	unsigned int num;	char	*str;{	int	i;	char	c, temp[17];	temp[0] = '\0';	for(i = 1; i <= 16; i++)  {		temp[i] = ((num%2) == 0) ? '0' : '1';		num = num >> 1;	}	for(i = 16; temp[i] == '0'; i--);	if( i == 0 )		i++;	while( i >= 0 )		*str++ = temp[i--];}LOCAL	_prtl2(num,str)	long num;	char	*str;{	int	i;	char	c, temp[35];	temp[0] = '\0';	for(i = 1; i <= 32; i++)  {		temp[i] = ((num%2) == 0) ? '0' : '1';		num = num >> 1;	}	for(i = 32; temp[i] == '0'; i--);	if( i == 0 )		i++;	while( i >= 0 )		*str++ = temp[i--];}@1.1log@Initial revision@text@@

⌨️ 快捷键说明

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