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

📄 old_vfprintf.c

📁 Axis 221 camera embedded programing interface
💻 C
📖 第 1 页 / 共 2 页
字号:
	const char *fmt0;	int preci, width;#define upcase i	int radix, dpoint /*, upcase*/;	char tmp[65];				/* TODO - determing needed size from headers */	char flag[sizeof(spec)];	__STDIO_AUTO_THREADLOCK_VAR;	__STDIO_AUTO_THREADLOCK(op);	__STDIO_STREAM_VALIDATE(op);	cnt = 0;	if (__STDIO_STREAM_IS_NARROW_WRITING(op)		|| !__STDIO_STREAM_TRANS_TO_WRITE(op, __FLAG_NARROW)		) {	while (*fmt) {		if (*fmt == '%') {			fmt0 = fmt;			/* save our position in case of bad format */			++fmt;			width = -1;			/* min field width */			preci = -5;			/* max string width or mininum digits */			radix = 10;			/* number base */			dpoint = 0;			/* found decimal point */			/* init flags */			for (p =(char *) spec ; *p ; p++) {				flag[p-spec] = '\0';			}			flag[FLAG_0_PAD] = ' ';			/* process optional flags */			for (p = (char *)spec ; *p ; ) {				if (*fmt == *p) {					flag[p-spec] = *fmt++;					p = (char *)spec; /* restart scan */				} else {					p++;				}			}						if (!flag[FLAG_PLUS]) {				flag[FLAG_PLUS] = flag[FLAG_SPACE];			}			/* process optional width and precision */			do {				if (*fmt == '.') {					++fmt;					dpoint = 1;				}				if (*fmt == '*') {	/* parameter width value */					++fmt;					i = va_arg(ap, int);				} else {					for ( i = 0 ; (*fmt >= '0') && (*fmt <= '9') ; ++fmt ) {						i = (i * 10) + (*fmt - '0');					}				}				if (dpoint) {					preci = i;					if (i<0) {						preci = -5;					}				} else {					width = i;					if (i<0) {						width = -i;						flag[FLAG_MINUS_LJUSTIFY] = 1;					}				}			} while ((*fmt == '.') && !dpoint );			/* process optional qualifier */			p = (char *) qual_chars;			do {				if (*fmt == *p) {					++fmt;					break;				}			} while (*++p);			if ((p - qual_chars < 2) && (*fmt == *p)) {				p += ((sizeof(qual_chars)-2) / 2);				++fmt;			}			dataargtype = ((int)(p[(sizeof(qual_chars)-2) / 2])) << 8;#if WANT_GNU_ERRNO			if (*fmt == 'm') {				flag[FLAG_PLUS] = '\0';				flag[FLAG_0_PAD] = ' ';				p = _glibc_strerror_r(errno, tmp, sizeof(tmp));				goto print;			}#endif			/* process format specifier */			for (p = (char *) u_spec ; *p ; p++) {				if (*fmt != *p) continue;				if (p-u_spec < 1) {	/* print a % */					goto charout;				}				if (p-u_spec < 2) {	/* store output count in int ptr */					_store_inttype(va_arg(ap, void *),								   dataargtype,								   (intmax_t) (cnt));					goto nextfmt;				}				if (p-u_spec < 10) {					if (*p == 'p') {#if INTPTR_MAX == INT_MAX						dataargtype = 0;#else#error Fix dataargtype for pointers!#endif					}					switch(dataargtype) {						case (PA_INT|PA_FLAG_LONG_LONG):#ifdef LLONG_MAX							intarg.ll = va_arg(ap, long long);							argptr = &intarg.ll;							break;#endif						case (PA_INT|PA_FLAG_LONG):#if LONG_MAX != INT_MAX							intarg.l = va_arg(ap, long);							argptr = &intarg.l;							break;#endif						default:							intarg.i = va_arg(ap, int);							argptr = &intarg.i;							break;					}				}				if (p-u_spec < 8) { /* unsigned conversion */					radix = u_radix[p-u_spec-2];					upcase = ((*p == 'x') ? __UIM_LOWER : __UIM_UPPER);					if (*p == 'p') {						upcase = __UIM_LOWER;						flag[FLAG_HASH] = 'p';					}					p = _uintmaxtostr(tmp + sizeof(tmp) - 1,									  (uintmax_t)									  _load_inttype(dataargtype, argptr, radix),									  radix, upcase);					flag[FLAG_PLUS] = '\0';	/* meaningless for unsigned */					if (*p != '0') { /* non-zero */						if (flag[FLAG_HASH]) {							if (radix == 8) {								*--p = '0';	/* add leadding zero */							} else if (radix != 10) { /* either 2 or 16 */								flag[FLAG_PLUS] = '0';								*--p = 'b';								if (radix == 16) {									*p = 'x';									if (*fmt == 'X') {										*p = 'X';									}								}							}						}					} else if (flag[FLAG_HASH] == 'p') { /* null pointer */						p = "(nil)";					}				} else if (p-u_spec < 10) { /* signed conversion */					p = _uintmaxtostr(tmp + sizeof(tmp) - 1,									  (uintmax_t)									  _load_inttype(dataargtype, argptr, -radix),									  -radix, upcase);				} else if (p-u_spec < 12) {	/* character or string */					flag[FLAG_PLUS] = '\0';					flag[FLAG_0_PAD] = ' ';					if (*p == 'c') {	/* character */						p = tmp;						*p = va_arg(ap, int);						/* This takes care of the "%c",0 case */						len = 1;						goto print_len_set;					} else {	/* string */						p = va_arg(ap, char *);						if (!p) {							p = "(null)";							preci = 6;						} else {							if (preci < 0) {								preci = INT_MAX;							}						}						len = strnlen(p, preci);						goto print_len_set;					}#if defined(__UCLIBC_HAS_FLOATS__) || WANT_FLOAT_ERROR				} else if (p-u_spec < 27) {		/* floating point */#endif /* defined(__UCLIBC_HAS_FLOATS__) || WANT_FLOAT_ERROR */#if defined(__UCLIBC_HAS_FLOATS__)					struct printf_info info;					if (preci < 0) {						preci = 6;					}					info.width = width;					info.prec = preci;					info.spec = *fmt;					info.pad = flag[FLAG_0_PAD];					info._flags = 0;					if (flag[FLAG_PLUS] == '+') {						PRINT_INFO_SET_FLAG(&info,showsign);					} else if (flag[FLAG_PLUS] == ' ') {						PRINT_INFO_SET_FLAG(&info,space);					}					if (flag[FLAG_HASH]) {						PRINT_INFO_SET_FLAG(&info,alt);					}					if (flag[FLAG_MINUS_LJUSTIFY]) {						PRINT_INFO_SET_FLAG(&info,left);					}#if 1					cnt += _fpmaxtostr(op, 									   (__fpmax_t)									   ((dataargtype == (8 << 8))										? va_arg(ap, long double)										: (long double) va_arg(ap, double)),									   &info, _fp_out_narrow);#else					cnt += _fpmaxtostr(op, 									   (__fpmax_t)									   ((lval > 1)										? va_arg(ap, long double)										: (long double) va_arg(ap, double)),									   &info, _fp_out_narrow);#endif					goto nextfmt;#elif WANT_FLOAT_ERROR					(void) ((lval > 1) ? va_arg(ap, long double)							: va_arg(ap, double)); /* carry on */					p = (char *) dbl_err;#endif /* defined(__UCLIBC_HAS_FLOATS__) */				}#if WANT_GNU_ERRNO			print:#endif				{				/* this used to be printfield */					/* cheaper than strlen call *//*  					for ( len = 0 ; p[len] ; len++ ) { } */					len = strnlen(p, SIZE_MAX);				print_len_set:					if ((*p == '-')#if WANT_GNU_ERRNO						&& (*fmt != 'm')#endif						&& (*fmt != 's')) {						flag[FLAG_PLUS] = *p++;						--len;					}				    if (flag[FLAG_PLUS]) {						++len;						++preci;						if (flag[FLAG_PLUS] == '0') { /* base 16 */							++preci; /* account for x or X */						}					}					if (preci >= 0) {						if ((*fmt == 's')#if WANT_GNU_ERRNO						|| (*fmt == 'm')#endif						) {							if (len > preci) {								len = preci;							} else {								preci = len;							}						}						preci -= len;						if (preci < 0) {							preci = 0;						}						width -= preci;					}					width -= len;					if (width < 0) {						width = 0;					}					if (preci < 0) {						preci = 0;						if (!flag[FLAG_MINUS_LJUSTIFY]							/* && flag[FLAG_PLUS] */							&& (flag[FLAG_0_PAD] == '0')) { 							preci = width;							width = 0;						}					}					while (width + len + preci) {						unsigned char ch;						/* right padding || left padding */						if ((!len && !preci)							|| (width && !flag[FLAG_MINUS_LJUSTIFY])) {							ch = ' ';							--width;						} else if (flag[FLAG_PLUS]) {							ch = flag[FLAG_PLUS]; /* sign */							if (flag[FLAG_PLUS]=='0') {	/* base 16 case */								flag[FLAG_PLUS] = *p++;	/* get the x|X */							} else {								flag[FLAG_PLUS] = '\0';							}							--len;						} else if (preci) {							ch = '0';							--preci;						} else {							ch = *p++; /* main field */							--len;						}						++cnt;						PUTC(ch, op);					}				}				goto nextfmt;			}			fmt = fmt0;	/* this was an illegal format */		}	charout:		++cnt;		PUTC(*fmt, op); /* normal char out */	nextfmt:		++fmt;	}	}	i = (__FERROR_UNLOCKED(op)) ? -1 : cnt;	__STDIO_STREAM_VALIDATE(op);	__STDIO_AUTO_THREADUNLOCK(op);	return i;}

⌨️ 快捷键说明

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