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

📄 sfvscanf.c

📁 su 的源代码库
💻 C
📖 第 1 页 / 共 2 页
字号:
			{	for(size = 0, n = *form; isdigit(n); n = *++form)					size = size*10 + (n - '0');			}			else if(*form == '*')			{	form = (*_Sffmtintf)(form+1,&n);				if(*form == '$')				{	form += 1;					if(!fp &&					   !(fp = (*_Sffmtposf)(f,oform,oargs,ft,1)))						goto pop_fmt;					n = FP_SET(n,argn);				}				else	n = FP_SET(-1,argn);				if(fp)	/* use position list */					size = fp[n].argv.i;				else if(ft && ft->extf )				{	FMTSET(ft, form,args, 'I',sizeof(int), 0, 0,0,0,						NIL(char*), 0);					if((*ft->extf)(f, (Void_t*)(&argv), ft) < 0)						goto pop_fmt;					if(ft->flags&SFFMT_VALUE)						size = argv.i;					else	size = va_arg(args,int);				}				else	size = va_arg(args,int);			}			goto loop_flags;		case 'l' :			size = -1; flags &= ~SFFMT_TYPES;			if(*form == 'l')			{	form += 1;				flags |= SFFMT_LLONG;			}			else	flags |= SFFMT_LONG;			goto loop_flags;		case 'h' :			size = -1; flags &= ~SFFMT_TYPES;			if(*form == 'h')			{	form += 1;				flags |= SFFMT_SSHORT;			}			else	flags |= SFFMT_SHORT;			goto loop_flags;		case 'L' :			size = -1; flags = (flags&~SFFMT_TYPES) | SFFMT_LDOUBLE;			goto loop_flags;		case 'j' :			size = -1; flags = (flags&~SFFMT_TYPES) | SFFMT_JFLAG;			goto loop_flags;		case 'z' :			size = -1; flags = (flags&~SFFMT_TYPES) | SFFMT_ZFLAG;			goto loop_flags;		case 't' :			size = -1; flags = (flags&~SFFMT_TYPES) | SFFMT_TFLAG;			goto loop_flags;		case QUOTE :			if(thousand > 0)				flags |= SFFMT_THOUSAND;			goto loop_flags;		}		/* set object size for scalars */		if(flags & SFFMT_TYPES)		{	if((_Sftype[fmt]&(SFFMT_INT|SFFMT_UINT)) || fmt == 'n')			{	if(flags&SFFMT_LONG)					size = sizeof(long);				else if(flags&SFFMT_SHORT)					size = sizeof(short);				else if(flags&SFFMT_SSHORT)					size = sizeof(char);				else if(flags&SFFMT_TFLAG)					size = sizeof(ptrdiff_t);				else if(flags&SFFMT_ZFLAG) 					size = sizeof(size_t);				else if(flags&(SFFMT_LLONG|SFFMT_JFLAG) )					size = sizeof(Sflong_t);				else if(flags&SFFMT_IFLAG)				{	if(size <= 0 ||					   size == sizeof(Sflong_t)*CHAR_BIT )						size = sizeof(Sflong_t);				}				else if(size < 0)					size = sizeof(int);			}			else if(_Sftype[fmt]&SFFMT_FLOAT)			{	if(flags&(SFFMT_LONG|SFFMT_LLONG))					size = sizeof(double);				else if(flags&SFFMT_LDOUBLE)					size = sizeof(Sfdouble_t);				else if(flags&SFFMT_IFLAG)				{	if(size <= 0)						size = sizeof(Sfdouble_t);				}				else if(size < 0)					size = sizeof(float);			}			else if(_Sftype[fmt]&SFFMT_CHAR)			{#if _has_multibyte				if((flags&SFFMT_LONG) || fmt == 'C')				{	size = sizeof(wchar_t) > sizeof(int) ?						sizeof(wchar_t) : sizeof(int);				} else#endif				if(size < 0)					size = sizeof(int);			}		}		argp = FP_SET(argp,argn);		if(fp)		{	if(!(fp[argp].ft.flags&SFFMT_SKIP) )			{	n_assign += 1;				value = fp[argp].argv.vp;				size = fp[argp].ft.size;				if(ft && ft->extf && fp[argp].ft.fmt != fp[argp].fmt)					fmt = fp[argp].ft.fmt;			}			else	flags |= SFFMT_SKIP;		}		else if(ft && ft->extf)		{	FMTSET(ft, form,args, fmt, size,flags, width,0,base, t_str,n_str);			SFend(f); SFOPEN(f,0);			v = (*ft->extf)(f, (Void_t*)&argv, ft);			SFLOCK(f,0); SFbuf(f);			if(v < 0)				goto pop_fmt;			else if(v > 0) /* extf comsumed v input bytes */			{	n_input += v;				if(!(ft->flags&SFFMT_SKIP) )					n_assign += 1;				continue;			}			else /* if(v == 0): extf did not use input stream */			{	FMTGET(ft, form,args, fmt, size, flags, width,n,base);				if((ft->flags&SFFMT_VALUE) && !(ft->flags&SFFMT_SKIP) )					value = argv.vp;			}		}		if(_Sftype[fmt] == 0) /* unknown pattern */			goto pop_fmt;		if(fmt == '!')		{	if(!fp)				fp = (*_Sffmtposf)(f,oform,oargs,ft,1);			else	goto pop_fmt;			if(!(argv.ft = va_arg(args,Sffmt_t*)) )				continue;			if(!argv.ft->form && ft ) /* change extension functions */			{	if(ft->eventf &&				   (*ft->eventf)(f,SF_DPOP,(Void_t*)form,ft) < 0)					continue;				fmstk->ft = ft = argv.ft;			}			else			/* stack a new environment */			{	if(!(fm = (Fmt_t*)malloc(sizeof(Fmt_t))) )					goto done;				ft = fm->ft = argv.ft;				SFMBSET(ft->mbs, &fmbs);				if(ft->form)				{	fm->form = (char*)form; SFMBCPY(&fm->mbs,&fmbs);					va_copy(fm->args,args);					fm->oform = oform;					va_copy(fm->oargs,oargs);					fm->argn = argn;					fm->fp = fp;					form = ft->form; SFMBCLR(ft->mbs);					va_copy(args,ft->args);					argn = -1;					fp = NIL(Fmtpos_t*);					oform = (char*)form;					va_copy(oargs,args);				}				else	fm->form = NIL(char*);				fm->eventf = ft->eventf;				fm->next = fmstk;				fmstk = fm;			}			continue;		}		/* get the address to assign value */		if(!value && !(flags&SFFMT_SKIP) )			value = va_arg(args,Void_t*);		if(fmt == 'n') /* return length of consumed input */		{#if !_ast_intmax_long			if(size == sizeof(Sflong_t) )				*((Sflong_t*)value) = (Sflong_t)(n_input+SFlen(f));			else#endif			if(size == sizeof(long) )				*((long*)value) = (long)(n_input+SFlen(f));			else if(size == sizeof(short) )				*((short*)value) = (short)(n_input+SFlen(f));			else if(size == sizeof(uchar))				*((uchar*)value) = (uchar)(n_input+SFlen(f));			else	*((int*)value) = (int)(n_input+SFlen(f));			continue;		}		/* if get here, start scanning input */		if(width == 0)			width = fmt == 'c' ? 1 : MAXWIDTH;		/* define the first input character */		if(fmt == 'c' || fmt == '[' || fmt == 'C' )			SFgetc(f,inp);		else		{	do	{ SFgetc(f,inp); }			while(isspace(inp)); /* skip starting blanks */		}		if(inp < 0)			goto done;		if(_Sftype[fmt] == SFFMT_FLOAT)		{	SFungetc(f,inp); SCinit(&scd,1);			argv.ld = _sfdscan((Void_t*)(&scd), _scgetc);			SCend(&scd,1);			if(scd.error >= 0)			{	if(inp >= 0)					SFungetc(f, inp);				goto pop_fmt;			}			if(value)			{#if !_ast_fltmax_double				if(size == sizeof(Sfdouble_t))					*((Sfdouble_t*)value) = argv.ld;				else#endif				if(size == sizeof(double))					*((double*)value) = (double)argv.ld;				else	*((float*)value) = (float)argv.ld;				n_assign += 1;			}		}		else if(_Sftype[fmt] == SFFMT_UINT || fmt == 'p')		{	if(inp == '-')			{	SFungetc(f,inp);				goto pop_fmt;			}			else	goto int_cvt;		}		else if(_Sftype[fmt] == SFFMT_INT)		{ int_cvt:			if(inp == '-' || inp == '+')			{	if(inp == '-')					flags |= SFFMT_MINUS;				while(--width > 0 && SFgetc(f,inp) >= 0)					if(!isspace(inp))						break;			}			if(inp < 0)				goto done;			if(fmt == 'o')				base = 8;			else if(fmt == 'x' || fmt == 'X' || fmt == 'p')				base = 16;			else if(fmt == 'i' && inp == '0') /* self-described data */			{	base = 8;				if(width > 1) /* peek to see if it's a base-16 */				{	if(SFgetc(f,inp) >= 0)					{	if(inp == 'x' || inp == 'X')							base = 16;						SFungetc(f,inp);					}					inp = '0';				}			}			/* now convert */			argv.lu = 0;			if(base == 16)			{	sp = (char*)_Sfcv36;				shift = 4;				if(sp[inp] >= 16)				{	SFungetc(f,inp);					goto pop_fmt;				}				if(inp == '0' && --width > 0)				{	/* skip leading 0x or 0X */					if(SFgetc(f,inp) >= 0 &&					   (inp == 'x' || inp == 'X') && --width > 0)						SFgetc(f,inp);				}				if(inp >= 0 && sp[inp] < 16)					goto base_shift;			}			else if(base == 10)			{	for(n = v = 0;; )				{	/* fast base 10 conversion */#define TEN(x) (((x) << 3) + ((x) << 1) )					if (inp >= '0' && inp <= '9')					{	argv.lu = TEN(argv.lu) + (inp-'0');						n += 1;					}					else if(inp == thousand)					{	if((v && n != 3) || (!v && n > 3) )							break;						v = 1; n = 0;					}					else	break;					if((width -= 1) <= 0 || SFgetc(f,inp) < 0)						break;				}				if (!n && !v)				{	SFungetc(f,inp);					goto pop_fmt;				}				if(fmt == 'i' && inp == '#' && !(flags&SFFMT_ALTER) )				{	base = (int)argv.lu;					if(base < 2 || base > SF_RADIX)						goto pop_fmt;					argv.lu = 0;					sp = (char*)(base <= 36 ? _Sfcv36 : _Sfcv64);					if(--width > 0 &&					   SFgetc(f,inp) >= 0 && sp[inp] < base)						goto base_conv;				}			}			else			{	/* other bases */				sp = (char*)(base <= 36 ? _Sfcv36 : _Sfcv64);				if(base < 2 || base > SF_RADIX || sp[inp] >= base)				{	SFungetc(f,inp);					goto pop_fmt;				}			base_conv: /* check for power of 2 conversions */				if((base & ~(base-1)) == base)				{	if(base < 8)						shift = base <  4 ? 1 : 2;					else if(base < 32)						shift = base < 16 ? 3 : 4;					else	shift = base < 64 ? 5 : 6;			base_shift:	do					{ argv.lu = (argv.lu << shift) + sp[inp];					} while(--width > 0 &&					        SFgetc(f,inp) >= 0 && sp[inp] < base);				}				else				{	do					{ argv.lu = (argv.lu * base) + sp[inp];					} while(--width > 0 &&						SFgetc(f,inp) >= 0 && sp[inp] < base);				}			}			if(flags&SFFMT_MINUS)				argv.ll = -argv.ll;			if(value)			{	n_assign += 1;				if(fmt == 'p')#if _more_void_int					*((Void_t**)value) = (Void_t*)((ulong)argv.lu);#else					*((Void_t**)value) = (Void_t*)((uint)argv.lu);#endif#if !_ast_intmax_long				else if(size == sizeof(Sflong_t))					*((Sflong_t*)value) = argv.ll;#endif				else if(size == sizeof(long))				{	if(fmt == 'd' || fmt == 'i')						*((long*)value) = (long)argv.ll;					else	*((ulong*)value) = (ulong)argv.lu;				}				else if(size == sizeof(short))				{	if(fmt == 'd' || fmt == 'i')						*((short*)value) = (short)argv.ll;					else	*((ushort*)value) = (ushort)argv.lu;				}				else if(size == sizeof(char) )				{	if(fmt == 'd' || fmt == 'i')						*((char*)value) = (char)argv.ll;					else	*((uchar*)value) = (uchar)argv.lu;				}				else				{	if(fmt == 'd' || fmt == 'i')						*((int*)value) = (int)argv.ll;					else	*((uint*)value) = (uint)argv.lu;				}			}		}		else if(fmt == 'C' || fmt == 'S')		{	fmt = fmt == 'C' ? 'c' : 's';			flags = (flags & ~SFFMT_TYPES) | SFFMT_LONG;			goto do_string;		}		else if(fmt == 's' || fmt == 'c' || fmt == '[' )		{ do_string:				if(value)			{	if(size < 0)					size = MAXWIDTH;				if(fmt != 'c')					size -= 1;#if _has_multibyte				if(flags&SFFMT_LONG)					argv.ws = (wchar_t*)value;				else#endif					argv.s = (char*)value;			}			else	size = 0;			if(fmt == '[' && !(form = _sfsetclass(form,&acc,flags)) )			{	SFungetc(f,inp);				goto pop_fmt;			}			n = 0; /* count number of scanned characters */#if _has_multibyte			if(flags&SFFMT_LONG)			{	SFungetc(f,inp); SCinit(&scd,0); SFMBCLR(&mbs);				for(; width > 0; --width)				{	if(SFgetwc(&scd,&wc,fmt,&acc,&mbs) == 0)						break;					if((n += 1) <= size)						*argv.ws++ = wc;				}				SCend(&scd,0);			}			else#endif			if(fmt == 's')			{	do				{	if(isspace(inp))						break;					if((n += 1) <= size)						*argv.s++ = inp;				} while(--width > 0 && SFgetc(f,inp) >= 0);			}			else if(fmt == 'c')			{	do			 	{	if((n += 1) <= size)						*argv.s++ = inp;				} while(--width > 0 && SFgetc(f,inp) >= 0);			}			else /* if(fmt == '[') */			{	do				{	if(!acc.ok[inp])					{	if(n > 0 || (flags&SFFMT_ALTER) )							break;						else						{	SFungetc(f,inp);							goto pop_fmt;						}					}					if((n += 1) <= size)						*argv.s++ = inp;				} while(--width > 0 && SFgetc(f,inp) >= 0);			}			if(value && (n > 0 || fmt == '[') )			{	n_assign += 1;				if(fmt != 'c' && size >= 0)				{#if _has_multibyte					if(flags&SFFMT_LONG)						*argv.ws = 0;					else#endif						*argv.s = 0;				}			}		}		if(width > 0 && inp >= 0)			SFungetc(f,inp);	}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);	SFOPEN(f,0);	if(n_assign == 0 && inp < 0)		n_assign = -1;	SFMTXRETURN(f,n_assign);}

⌨️ 快捷键说明

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