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

📄 sfvprintf.c

📁 su 的源代码库
💻 C
📖 第 1 页 / 共 2 页
字号:
			continue;		case 'S':			flags = (flags & ~SFFMT_TYPES) | SFFMT_LONG;		case 's':			if(base >= 0)	/* list of strings */			{	if(!(ls = argv.sp) || !ls[0])					continue;			}			else			{	if(!(sp = argv.s))				{	sp = "(null)";					flags &= ~SFFMT_LONG;				}				ls = tls; tls[0] = sp;			}			for(sp = *ls;;)			{	/* set v to the number of bytes to output */#if _has_multibyte				if(flags & SFFMT_LONG)				{	v = 0;					SFMBCLR(&mbs);					for(n = 0, wsp = (wchar_t*)sp;; ++wsp, ++n)					{	if((size >= 0 && n >= size) ||						   (size <  0 && *wsp == 0) )							break;						if((n_s = wcrtomb(buf, *wsp, &mbs)) <= 0)							break;						if(precis >= 0 && (v+n_s) > precis )							break;						v += n_s;					}				}				else#endif				{	if((v = size) < 0)						for(v = 0; sp[v]; ++v)							if(v == precis)								break;				}				if(precis >= 0 && v > precis)					v = precis;				if((n = width - v) > 0 && !(flags&SFFMT_LEFT) )					{ SFnputc(f, ' ', n); n = 0; }#if _has_multibyte				if(flags & SFFMT_LONG)				{	SFMBCLR(&mbs);					for(wsp = (wchar_t*)sp; v > 0; ++wsp, v -= n_s)					{	if((n_s = wcrtomb(buf, *wsp, &mbs)) <= 0)							break;						sp = buf; SFwrite(f, sp, n_s);					}				}				else#endif					{ SFwrite(f,sp,v); }				if(n > 0)					{ SFnputc(f,' ',n); }				if(!(sp = *++ls))					break;				else if(base > 0)					{ SFputc(f,base); }			}			continue;		case 'C':			flags = (flags & ~SFFMT_TYPES) | SFFMT_LONG;		case 'c':			if(precis <= 0) /* # of times to repeat a character */				precis = 1;#if _has_multibyte			if(flags & SFFMT_LONG)			{	if(base >= 0)				{	if(!(wsp = (wchar_t*)argv.s) )						continue;					for(size = 0; wsp[size]; ++size)						;				}				else				{	wsp = &argv.wc;					size = 1;				}			}			else#endif			{	if(base >= 0)				{	if(!(sp = argv.s) )						continue;					size = strlen(sp);				}				else				{	argv.c = (char)(argv.i);					sp = &argv.c;					size = 1;				}			}			while(size > 0)			{#if _has_multibyte				if(flags&SFFMT_LONG)				{	SFMBCLR(&mbs);					if((n_s = wcrtomb(buf, *wsp++, &mbs)) <= 0)						break;					n = width - precis*n_s; /* padding amount */				}				else#endif				if(flags&SFFMT_ALTER)				{	n_s = chr2str(buf, *sp++);					n = width - precis*n_s;				}				else				{	fmt = *sp++;					n = width - precis;				}				if(n > 0 && !(flags&SFFMT_LEFT) )					{ SFnputc(f,' ',n); n = 0; };				v = precis; /* need this because SFnputc may clear it */#if _has_multibyte				if(flags&SFFMT_LONG)				{	for(; v > 0; --v)						{ ssp = buf; k = n_s; SFwrite(f,ssp,k); }				}				else#endif				if(flags&SFFMT_ALTER)				{	for(; v > 0; --v)						{ ssp = buf; k = n_s; SFwrite(f,ssp,k); }				}				else				{	SFnputc(f, fmt, v);				}				if(n > 0)					{ SFnputc(f,' ',n); };				if((size -= 1) > 0 && base > 0)					{ SFputc(f,base); }			}			continue;		case 'n':	/* return current output length */			SFEND(f);#if !_ast_intmax_long			if(size == sizeof(Sflong_t) )				*((Sflong_t*)argv.vp) = (Sflong_t)n_output;			else#endif			if(size == sizeof(long))				*((long*)argv.vp) = (long)n_output;			else if(size == sizeof(short) )				*((short*)argv.vp) = (short)n_output;			else if(size == sizeof(uchar) )				*((uchar*)argv.vp) = (uchar)n_output;			else	*((int*)argv.vp) = (int)n_output;			continue;		case 'p':	/* pointer value */			fmt = 'x';			base = 16; n_s = 15; n = 4;			flags = (flags&~(SFFMT_SIGN|SFFMT_BLANK|SFFMT_ZERO))|SFFMT_ALTER;#if _more_void_int			lv = (Sflong_t)((Sfulong_t)argv.vp);			goto long_cvt;#else			v = (int)((uint)argv.vp);			goto int_cvt;#endif		case 'o':			base = 8; n_s = 7; n = 3;			flags &= ~(SFFMT_SIGN|SFFMT_BLANK);			goto int_arg;		case 'X':			ssp = "0123456789ABCDEF";		case 'x':			base = 16; n_s = 15; n = 4;			flags &= ~(SFFMT_SIGN|SFFMT_BLANK);			goto int_arg;		case 'i':			fmt = 'd';			goto d_format;		case 'u':			flags &= ~(SFFMT_SIGN|SFFMT_BLANK);		case 'd':		d_format:			if(base < 2 || base > SF_RADIX)				base = 10;			if((base&(n_s = base-1)) == 0)			{	if(base < 8)					n = base <  4 ? 1 : 2;				else if(base < 32)					n = base < 16 ? 3 : 4;				else	n = base < 64 ? 5 : 6;			}			else	n_s = base == 10 ? -1 : 0;		int_arg:#if !_ast_intmax_long ||  _more_long_int || _more_void_int			if(size == sizeof(Sflong_t))			{	lv = argv.ll;				goto long_cvt;			}			else if(sizeof(long) < sizeof(Sflong_t) && size == sizeof(long))			{	if(fmt == 'd')					lv = (Sflong_t)argv.l;				else	lv = (Sflong_t)argv.ul;			long_cvt:				if(lv == 0 && precis == 0)					break;				if(lv < 0 && fmt == 'd' )				{	flags |= SFFMT_MINUS;					if(lv == HIGHBITL) /* avoid overflow */					{	lv = (Sflong_t)(HIGHBITL/base);						*--sp = _Sfdigits[HIGHBITL -								  ((Sfulong_t)lv)*base];					}					else	lv = -lv;				}				if(n_s < 0)	/* base 10 */				{	Sflong_t	nv;					sfucvt(lv,sp,nv,ssp,Sflong_t,Sfulong_t);				}				else if(n_s > 0) /* base power-of-2 */				{	do					{	*--sp = ssp[lv&n_s];					} while((lv = ((Sfulong_t)lv) >> n) );				}				else		/* general base */				{	do					{	*--sp = ssp[((Sfulong_t)lv)%base];					} while((lv = ((Sfulong_t)lv)/base) );				}			} else#endif			if(sizeof(short) < sizeof(int) && size == sizeof(short) )			{	if(fmt == 'd')					v = (int)((short)argv.i);				else	v = (int)((ushort)argv.i);				goto int_cvt;			}			else if(size == sizeof(char))			{	if(fmt != 'd')					v = (int)((uchar)argv.i);				else				{#if _key_signed					v = (int)((signed char)argv.i);#else					if(argv.i < 0)						v = -((int)((char)(-argv.i)));					else	v =  ((int)((char)( argv.i)));#endif				}				goto int_cvt;			}			else			{	v = argv.i;			int_cvt:				if(v == 0 && precis == 0)					break;				if(v < 0 && fmt == 'd' )				{	flags |= SFFMT_MINUS;					if(v == HIGHBITI) /* avoid overflow */					{	v = (int)(HIGHBITI/base);						*--sp = _Sfdigits[HIGHBITI -								  ((uint)v)*base];					}					else	v = -v;				}				if(n_s < 0)	/* base 10 */				{	sfucvt(v,sp,n,ssp,int,uint);				}				else if(n_s > 0) /* base power-of-2 */				{	do					{	*--sp = ssp[v&n_s];					} while((v = ((uint)v) >> n) );				}				else /* n_s == 0, general base */				{	do					{	*--sp = ssp[((uint)v)%base];					} while((v = ((uint)v)/base) );				}			}			if(n_s < 0 && (flags&SFFMT_THOUSAND) && (n = endsp-sp) > 3)			{	if((n %= 3) == 0)					n = 3; 				for(ep = buf+SLACK, endep = ep + n; ; )				{	while(ep < endep)						*ep++ = *sp++;					if(sp == endsp)						break;					if(sp <= endsp-3)						*ep++ = thousand;					endep = ep+3;				}				sp = buf+SLACK;				endsp = ep;			}			/* zero padding for precision if have room in buffer */			if(precis > 0 && (precis -= (endsp-sp)) < (sp-buf)-64)				while(precis-- > 0)					*--sp = '0';			if(flags&SFFMT_ALTER) /* prefix */			{	if(fmt == 'o')				{	if(*sp != '0')						*--sp = '0';				}				else				{	if(width > 0 && (flags&SFFMT_ZERO))					{	/* do 0 padding first */						if(fmt == 'x' || fmt == 'X')							n = 0;						else if(dot < 2)							n = width;						else	n = base < 10 ? 2 : 3;						n += (flags&(SFFMT_MINUS|SFFMT_SIGN)) ?							1 : 0;						n = width - (n + (endsp-sp));						while(n-- > 0)							*--sp = '0';					}					if(fmt == 'x' || fmt == 'X')					{	*--sp = (char)fmt;						*--sp = '0';					}					else if(dot >= 2)					{	/* base#value notation */						*--sp = '#';						if(base < 10)							*--sp = (char)('0'+base);						else						{	*--sp = _Sfdec[(base <<= 1)+1];							*--sp = _Sfdec[base];						}					}				}			}			break;		case 'g': case 'G': /* these ultimately become %e or %f */		case 'a': case 'A':		case 'e': case 'E':		case 'f':#if !_ast_fltmax_double			if(size == sizeof(Sfdouble_t) )			{	v = SFFMT_LDOUBLE;				dval = argv.ld;			}			else#endif			{	v = 0;				dval = argv.d;			}			if(fmt == 'e' || fmt == 'E')			{	n = (precis = precis < 0 ? FPRECIS : precis)+1;				v |= SFFMT_EFORMAT;				ep = _sfcvt(dval,tmp,sizeof(tmp), min(n,SF_FDIGITS),					    &decpt, &sign, &n_s, v);				goto e_format;			}			else if(fmt == 'f' || fmt == 'F')			{	precis = precis < 0 ? FPRECIS : precis;				ep = _sfcvt(dval,tmp,sizeof(tmp), min(precis,SF_FDIGITS),					    &decpt, &sign, &n_s, v);				goto f_format;			}			else if(fmt == 'a' || fmt == 'A')			{	if(precis < 0)				{	if(v == SFFMT_LDOUBLE)						precis = 2*(sizeof(Sfdouble_t) - 2);					else	precis = 2*(sizeof(double) - 2);				}				n = precis + 1;				v |= SFFMT_AFORMAT | (fmt == 'A' ? SFFMT_UPPER : 0);				ep = _sfcvt(dval,tmp,sizeof(tmp), min(n,SF_FDIGITS),					    &decpt, &sign, &n_s, v);				sp = endsp = buf+1;	/* reserve space for sign */				*endsp++ = '0';				*endsp++ = fmt == 'a' ? 'x' : 'X';				if (!isxdigit(*ep))					goto infinite;				goto a_format;			}			else /* 'g' or 'G' format */			{	precis = precis < 0 ? FPRECIS : precis == 0 ? 1 : precis;				v |= SFFMT_EFORMAT;				ep = _sfcvt(dval,tmp,sizeof(tmp), min(precis,SF_FDIGITS),					    &decpt, &sign, &n_s, v);				if(dval == 0.)					decpt = 1;				else if(*ep == 'I')					goto infinite;				if(!(flags&SFFMT_ALTER))				{	/* zap trailing 0s */					if((n = n_s) > precis)						n = precis;					while((n -= 1) >= 1 && ep[n] == '0')						;					n += 1;				}				else	n = precis;				if(decpt < -3 || decpt > precis)				{	precis = n-1;					goto e_format;				}				else				{	precis = n - decpt;					goto f_format;				}			}		e_format: /* build the x.yyyy string */			if(isalpha(*ep))				goto infinite;			sp = endsp = buf+1;	/* reserve space for sign */		a_format:			*endsp++ = *ep ? *ep++ : '0';			SFSETLOCALE(&decimal,&thousand);			if(precis > 0 || (flags&SFFMT_ALTER))				*endsp++ = decimal;			ssp = endsp;			endep = ep+precis;			while((*endsp++ = *ep++) && ep <= endep)				;			precis -= (endsp -= 1) - ssp;			/* build the exponent */			ep = endep = buf+(sizeof(buf)-1);			if(dval != 0.)			{	if((n = decpt - 1) < 0)					n = -n;				while(n > 9)				{	v = n; n /= 10;						*--ep = (char)('0' + (v - n*10));				}			}			else	n = 0;			*--ep = (char)('0' + n);			if(endep-ep <= 1)	/* at least 2 digits */				*--ep = '0';			/* the e/Exponent separator and sign */			*--ep = (decpt > 0 || dval == 0.) ? '+' : '-';			*--ep = fmt == 'a' ? 'p' : fmt == 'A' ? 'P' :				isupper(fmt) ? 'E' : 'e';			goto end_aefg;		f_format: /* data before the decimal point */			if(isalpha(*ep))			{			infinite:				endsp = (sp = ep)+sfslen();				ep = endep;				precis = 0;				goto end_aefg;			}			SFSETLOCALE(&decimal,&thousand);			endsp = sp = buf+1;	/* save a space for sign */			endep = ep+decpt;			if(decpt > 3 && (flags&SFFMT_THOUSAND) )			{	if((n = decpt%3) == 0)					n = 3;				while(ep < endep && (*endsp++ = *ep++) )				{	if(--n == 0 && (ep <= endep-3) )					{	*endsp++ = thousand;						n = 3;					}				}			}			else			{	while(ep < endep && (*endsp++ = *ep++))					;			}			if(endsp == sp)				*endsp++ = '0';			if(precis > 0 || (flags&SFFMT_ALTER))				*endsp++ = decimal;			if((n = -decpt) > 0)			{	/* output zeros for negative exponent */				ssp = endsp + min(n,precis);				precis -= n;				while(endsp < ssp)					*endsp++ = '0';			}			ssp = endsp;			endep = ep+precis;			while((*endsp++ = *ep++) && ep <= endep)				;			precis -= (endsp -= 1) - ssp;			ep = endep;		end_aefg:			flags |= SFFMT_FLOAT;			if(sign)				flags |= SFFMT_MINUS;			break;		}		if(flags == 0 && width <= 0)			goto do_output;		if(flags&SFFMT_PREFIX)			fmt = (flags&SFFMT_MINUS) ? '-' : (flags&SFFMT_SIGN) ? '+' : ' ';		n = (endsp-sp) + (endep-ep) + (precis <= 0 ? 0 : precis) +		    ((flags&SFFMT_PREFIX) ? 1 : 0);		if((v = width-n) <= 0)			v = 0;		else if(!(flags&SFFMT_ZERO)) /* right padding */		{	if(flags&SFFMT_LEFT)				v = -v;			else if(flags&SFFMT_PREFIX) /* blank padding, output prefix now */			{	*--sp = fmt;				flags &= ~SFFMT_PREFIX;			}		}		if(flags&SFFMT_PREFIX) /* put out the prefix */		{	SFputc(f,fmt);			if(fmt != ' ')				flags |= SFFMT_ZERO;		}		if((n = v) > 0) /* left padding */		{	v = (flags&SFFMT_ZERO) ? '0' : ' ';			SFnputc(f,v,n);		}		if((n = precis) > 0 && !(flags&SFFMT_FLOAT))		{	/* padding for integer precision */			SFnputc(f,'0',n);			precis = 0;		}	do_output:		if((n = endsp-sp) > 0)			SFwrite(f,sp,n);		if(flags&(SFFMT_FLOAT|SFFMT_LEFT))		{	/* SFFMT_FLOAT: right padding for float precision */			if((n = precis) > 0)				SFnputc(f,'0',n);			/* SFFMT_FLOAT: the exponent of %eE */			if((n = endep - (sp = ep)) > 0)				SFwrite(f,sp,n);			/* SFFMT_LEFT: right padding */			if((n = -v) > 0)				SFnputc(f,' ',n);		}	}pop_fmt:	if(fp)	{	free(fp);		fp = NIL(Fmtpos_t*);	}	while((fm = fmstk) ) /* pop the format stack and continue */	{	if(fm->eventf)		{	if(!form || !form[0])				(*fm->eventf)(f,SF_FINAL,NIL(Void_t*),ft);			else if((*fm->eventf)(f,SF_DPOP,(Void_t*)form,ft) < 0)				goto loop_fmt;		}		fmstk = fm->next;		if((form = fm->form) )		{	SFMBCPY(&fmbs,&fm->mbs);			va_copy(args, fm->args);			oform = fm->oform;			va_copy(oargs,fm->oargs);			argn = fm->argn;			fp = fm->fp;		}		ft = fm->ft;		free(fm);		if(form && form[0])			goto loop_fmt;	}done:	if(fp)		free(fp);	while((fm = fmstk) )	{	if(fm->eventf)			(*fm->eventf)(f,SF_FINAL,NIL(Void_t*),fm->ft);		fmstk = fm->next;		free(fm);	}	SFEND(f);	n = f->next - f->data;	if((sp = (char*)f->data) == data)		f->endw = f->endr = f->endb = f->data = NIL(uchar*);	f->next = f->data;	if((((flags = f->flags)&SF_SHARE) && !(flags&SF_PUBLIC) ) ||	   (n > 0 && (sp == data || (flags&SF_LINE) ) ) )		(void)SFWRITE(f,(Void_t*)sp,n);	else	f->next += n;	SFOPEN(f,0);	SFMTXRETURN(f, n_output);}

⌨️ 快捷键说明

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