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

📄 vfprintf.c

📁 Newlib 嵌入式 C库 标准实现代码
💻 C
📖 第 1 页 / 共 3 页
字号:
#ifndef _NO_LONGLONG#define	SARG() \	(flags&QUADINT ? va_arg(ap, quad_t) : \	    flags&LONGINT ? GET_LONG(ap) : \	    flags&SHORTINT ? (long)GET_SHORT(ap) : \	    (long)GET_INT(ap))#define	UARG() \	(flags&QUADINT ? va_arg(ap, u_quad_t) : \	    flags&LONGINT ? GET_ULONG(ap) : \	    flags&SHORTINT ? (u_long)GET_USHORT(ap) : \	    (u_long)GET_UINT(ap))#ifdef __SPE__#define	SFPARG() \	(flags&LONGINT ? va_arg(ap, quad_t) : \	    flags&SHORTINT ? (long)GET_SHORT(ap) : \	    (long)va_arg(ap, int))#define	UFPARG() \	(flags&LONGINT ? va_arg(ap, u_quad_t) : \	    flags&SHORTINT ? (u_long)GET_USHORT(ap) : \	    (u_long)va_arg(ap, u_int))#endif /* __SPE__ */#else#define	SARG() \	(flags&LONGINT ? GET_LONG(ap) : \	    flags&SHORTINT ? (long)GET_SHORT(ap) : \	    (long)GET_INT(ap))#define	UARG() \	(flags&LONGINT ? GET_ULONG(ap) : \	    flags&SHORTINT ? (u_long)GET_USHORT(ap) : \	    (u_long)GET_UINT(ap))#ifdef __SPE__#define	SFPARG() \	(flags&LONGINT ? (va_arg(ap, long) << 32) : \	    flags&SHORTINT ? (long)GET_SHORT(ap) : \	    (long)va_arg(ap, int))#define	UFPARG() \	(flags&LONGINT ? (va_arg(ap, u_long) <<32) : \	    flags&SHORTINT ? (u_long)GET_USHORT(ap) : \	    (u_long)va_arg(ap, u_int))#endif /* __SPE__ */#endif        memset (&state, '\0', sizeof (state));	/* sorry, fprintf(read_only_file, "") returns EOF, not 0 */	if (cantwrite (data, fp)) {		_funlockfile (fp);			return (EOF);	}	/* optimise fprintf(stderr) (and other unbuffered Unix files) */	if ((fp->_flags & (__SNBF|__SWR|__SRW)) == (__SNBF|__SWR) &&	    fp->_file >= 0)		return (__sbprintf_r(data, fp, fmt0, ap));	fmt = (char *)fmt0;	uio.uio_iov = iovp = iov;	uio.uio_resid = 0;	uio.uio_iovcnt = 0;	ret = 0;	/*	 * Scan the format for conversions (`%' character).	 */	for (;;) {	        cp = fmt;	        while ((n = _mbtowc_r(_REENT, &wc, fmt, MB_CUR_MAX, &state)) > 0) {			fmt += n;			if (wc == '%') {				fmt--;				break;			}		}		if ((m = fmt - cp) != 0) {			PRINT(cp, m);			ret += m;		}		if (n <= 0)			goto done;		fmt++;		/* skip over '%' */		flags = 0;		dprec = 0;		width = 0;		prec = -1;		sign = '\0';		old_sign = '\0';#ifdef __ALTIVEC__		vec_print_count = 0;		vec_sep = ' ';#endif /* __ALTIVEC__ */		format_anchor = fmt;rflag:		ch = *fmt++;		old_ch = ch;reswitch:	switch (ch) {		case ' ':			/*			 * ``If the space and + flags both appear, the space			 * flag will be ignored.''			 *	-- ANSI X3J11			 */			if (!sign)				sign = ' ';			goto rflag;		case '#':			flags |= ALT;			goto rflag;		case '*':			/*			 * ``A negative field width argument is taken as a			 * - flag followed by a positive field width.''			 *	-- ANSI X3J11			 * They don't exclude field widths read from args.			 */			if ((width = va_arg(ap, int)) >= 0)				goto rflag;			width = -width;			/* FALLTHROUGH */		case '-':			flags |= LADJUST;			goto rflag;		case '+':			sign = '+';			goto rflag;#ifdef __ALTIVEC__		case ',':		case ';':		case ':':		case '_':		        if (vec_sep != ' ')		          {		            fmt = format_anchor;		            continue;		          }			vec_sep = ch;			goto rflag;#endif /* __ALTIVEC__ */		case '.':			if ((ch = *fmt++) == '*') {				n = va_arg(ap, int);				prec = n < 0 ? -1 : n;				goto rflag;			}			n = 0;			while (is_digit(ch)) {				n = 10 * n + to_digit(ch);				ch = *fmt++;			}			prec = n < 0 ? -1 : n;			goto reswitch;		case '0':			/*			 * ``Note that 0 is taken as a flag, not as the			 * beginning of a field width.''			 *	-- ANSI X3J11			 */			flags |= ZEROPAD;			goto rflag;		case '1': case '2': case '3': case '4':		case '5': case '6': case '7': case '8': case '9':			n = 0;			do {				n = 10 * n + to_digit(ch);				ch = *fmt++;			} while (is_digit(ch));			width = n;			goto reswitch;#ifdef FLOATING_POINT		case 'L':#ifdef __ALTIVEC__		        if (flags & VECTOR) 			  {			    fmt = format_anchor;			    continue;			  }#endif /* __ALTIVEC__ */			flags |= LONGDBL;			goto rflag;#endif		case 'h':		        if (flags & LONGINT)		          {		            fmt = format_anchor;		            continue;		          }			flags |= SHORTINT;#ifdef __ALTIVEC__			if (flags & VECTOR)			  vec_print_count = 8;#endif			goto rflag;		case 'l':		        if (flags & SHORTINT)		          {		            fmt = format_anchor;		            continue;		          }			if (*fmt == 'l') {				fmt++;				flags |= QUADINT;				flags &= ~VECTOR;			} else {				flags |= LONGINT;#ifdef __ALTIVEC__				if (flags & VECTOR)				  vec_print_count = 4;#endif			}			goto rflag;#ifdef __ALTIVEC__		case 'v':		        if (flags & VECTOR) 			  {			    fmt = format_anchor;			    continue;			  }			flags |= VECTOR;			vec_print_count = (flags & SHORTINT) ? 8 : 			  ((flags & LONGINT) ? 4 : 16);			goto rflag;#endif                case 'q':#ifdef __ALTIVEC__		        if (flags & VECTOR) 			  {			    fmt = format_anchor;			    continue;			  }#endif /* __ALTIVEC__ */			flags |= QUADINT;			goto rflag;		case 'c':#ifdef __ALTIVEC__			if (flags & VECTOR)			  {			    int k;			    vec_16_byte_union tmp;		            if (flags & (SHORTINT | LONGINT))		              {		                fmt = format_anchor;		                continue;		              }			    tmp.v = va_arg(ap, vector int);			    cp = buf;			    for (k = 0; k < 15; ++k)			      {			        *cp++ = tmp.c[k];			        if (vec_sep != ' ')			          *cp++ = vec_sep;			      }			    *cp++ = tmp.c[15];			    size = cp - buf;			    cp = buf;			    vec_print_count = 0;			  }			else#endif /* __ALTIVEC__ */			  {			    *(cp = buf) = va_arg(ap, int);			    size = 1;			  }			sign = '\0';			break;		case 'D':			flags |= LONGINT;			/*FALLTHROUGH*/		case 'd':		case 'i':#ifdef __ALTIVEC__		        if (!(flags & VECTOR) && vec_sep != ' ') 			  {			    fmt = format_anchor;			    continue;			  }#endif /* __ALTIVEC__ */			_uquad = SARG();#ifndef _NO_LONGLONG			if ((quad_t)_uquad < 0)#else			if ((long) _uquad < 0)#endif			{				_uquad = -_uquad;				old_sign = sign;				sign = '-';			}			base = DEC;			goto number;#ifdef FLOATING_POINT		case 'e':		case 'E':		case 'f':		case 'g':		case 'G':			if (prec == -1) {				prec = DEFPREC;			} else if ((ch == 'g' || ch == 'G') && prec == 0) {				prec = 1;			}#ifdef _NO_LONGDBL			if (flags & LONGDBL) {				_fpvalue = (double) va_arg(ap, _LONG_DOUBLE);#ifdef __ALTIVEC__			} else if (flags & VECTOR) {				if (vec_print_count >= 4)                                  {                                    vec_print_count = 4;				    vec_tmp.v = va_arg(ap, vector int);                                  }				_fpvalue = (double)vec_tmp.f[4 - vec_print_count];			} else if (vec_sep != ' ') {			         fmt = format_anchor;			         continue;			#endif /* __ALTIVEC__ */			} else {				_fpvalue = va_arg(ap, double);			}			/* do this before tricky precision changes */			if (isinf(_fpvalue)) {				if (_fpvalue < 0)				  {				    old_sign = sign;				    sign = '-';				  }				    				cp = "Inf";				size = 3;				break;			}			if (isnan(_fpvalue)) {				cp = "NaN";				size = 3;				break;			}#else /* !_NO_LONGDBL */						if (flags & LONGDBL) {				_fpvalue = va_arg(ap, _LONG_DOUBLE);#ifdef __ALTIVEC__			} else if (flags & VECTOR) {				if (vec_print_count >= 4)                                  {                                    vec_print_count = 4;				    vec_tmp.v = va_arg(ap, vector int);                                  }				_fpvalue = (_LONG_DOUBLE)k.f[4 - vec_print_count];#endif /* __ALTIVEC__ */			} else {				_fpvalue = (_LONG_DOUBLE)va_arg(ap, double);			}			/* do this before tricky precision changes */			tmp = _ldcheck (&_fpvalue);			if (tmp == 2) {				if (_fpvalue < 0)				  {				    old_sign = sign;				    sign = '-';				  }				cp = "Inf";				size = 3;				break;			}			if (tmp == 1) {				cp = "NaN";				size = 3;				break;			}#endif /* !_NO_LONGDBL */			flags |= FPT;			cp = cvt(data, _fpvalue, prec, flags, &softsign,				&expt, ch, &ndig);			if (ch == 'g' || ch == 'G') {				if (expt <= -4 || expt > prec)				  {				    old_ch = ch;				    ch = (ch == 'g') ? 'e' : 'E';				  }				else					ch = 'g';			} 			if (ch <= 'e') {	/* 'e' or 'E' fmt */				--expt;				expsize = exponent(expstr, expt, ch);				size = expsize + ndig;				if (ndig > 1 || flags & ALT)					++size;			} else if (ch == 'f') {		/* f fmt */				if (expt > 0) {					size = expt;					if (prec || flags & ALT)						size += prec + 1;				} else	/* "0.X" */                                        size = (prec || flags & ALT)                                                  ? prec + 2                                                  : 1;			} else if (expt >= ndig) {	/* fixed g fmt */				size = expt;				if (flags & ALT)					++size;			} else				size = ndig + (expt > 0 ?					1 : 2 - expt);			if (softsign)			  {			    old_sign = sign;			    sign = '-';			  }			break;#endif /* FLOATING_POINT */#ifdef __SPE__                case 'r':		        flags |= FIXEDPOINT;	     	        _uquad = SFPARG();			if ((quad_t)_uquad < 0)			  {			    sign = '-';			    _uquad = -(quad_t)_uquad;			  }			if (flags & SHORTINT)			  _uquad <<= 49;			else if (flags & LONGINT)			  _uquad <<= 1;			else			  _uquad <<= 33;			if (_uquad == 0 && sign)			  {			    /* we have -1.0 which has to be handled special */			    cp = "100000";			    expt = 1;			    ndig = 6;			    break;			  }			goto fixed_nosign;                case 'R':		        flags |= FIXEDPOINT;		        _uquad = UFPARG();			if (flags & SHORTINT)			  _uquad <<= 48;			else if (!(flags & LONGINT))			  _uquad <<= 32;	fixed_nosign:			if (prec == -1)			  prec = DEFPREC;			cp = cvt_ufix64 (data, _uquad, prec, &expt, &ndig);			/* act like %f of format "0.X" */			size = prec + 2;                        break;#endif /* __SPE__ */		case 'n':#ifdef __ALTIVEC__		        if (flags & VECTOR)			  {			    fmt = format_anchor;			    continue;			  }#endif /* __ALTIVEC__ */#ifndef _NO_LONGLONG			if (flags & QUADINT)				*va_arg(ap, quad_t *) = ret;			else #endif			if (flags & LONGINT)

⌨️ 快捷键说明

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