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

📄 printf.c

📁 linux下用PCMCIA无线网卡虚拟无线AP的程序源码
💻 C
📖 第 1 页 / 共 2 页
字号:
int vfnprintf(FILE * op, size_t max_size, const char *fmt, va_list ap){	int i, cnt, lval, len;	char *p;	const char *fmt0;	int buffer_mode;	int preci, width;#define upcase i	int radix, dpoint /*, upcase*/;#if defined(__UCLIBC_HAS_LONG_LONG__)	char tmp[65];#else	char tmp[33];#endif	char flag[sizeof(spec)];	cnt = 0;	/* This speeds things up a bit for line unbuffered */	buffer_mode = (op->mode & __MODE_BUF);	op->mode &= (~__MODE_BUF);	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 */#if INT_MAX != LONG_MAX			lval = 0;			/* sizeof(int) != sizeof(long) */#else			lval = 1;			/* sizeof(int) == sizeof(long) */#endif			tmp[1] = 0;			/* set things up for %c -- better done here */			/* 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 */			for (p = (char *) qual ; *p ; p++) {				if (*p == *fmt) {					lval = p - qual;					++fmt;#if defined(__UCLIBC_HAS_LONG_LONG__) || WANT_LONG_LONG_ERROR					if ((*p == 'l') && (*fmt == *p)) {						++lval;						++fmt;					}#endif /* defined(__UCLIBC_HAS_LONG_LONG__) || WANT_LONG_LONG_ERROR */				}			}#if WANT_GNU_ERRNO			if (*fmt == 'm') {				flag[FLAG_PLUS] = '\0';				flag[FLAG_0_PAD] = ' ';				p = strerror(errno);				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 */					*(va_arg(ap, int *)) = cnt;					goto nextfmt;				}				if (p-u_spec < 8) { /* unsigned conversion */					radix = u_radix[p-u_spec-2];					upcase = ((int)'x') - *p;					if (*p == 'p') {						lval = (sizeof(char *) == sizeof(long));						upcase = 0;						flag[FLAG_HASH] = 'p';					}#if defined(__UCLIBC_HAS_LONG_LONG__) || WANT_LONG_LONG_ERROR					if (lval >= 2) {#if defined(__UCLIBC_HAS_LONG_LONG__)						p = __ulltostr(tmp + sizeof(tmp) - 1,									   va_arg(ap, unsigned long long),									   radix, upcase);#else						(void) va_arg(ap, unsigned long long);	/* cary on */						p = (char *) ll_err;#endif /* defined(__UCLIBC_HAS_LONG_LONG__) */					} else {#endif /* defined(__UCLIBC_HAS_LONG_LONG__) || WANT_LONG_LONG_ERROR */#if UINT_MAX != ULONG_MAX						/* sizeof(unsigned int) != sizeof(unsigned long) */						p = __ultostr(tmp + sizeof(tmp) - 1, (unsigned long)									  ((lval)									   ? va_arg(ap, unsigned long)									   : va_arg(ap, unsigned int)),									  radix, upcase);#else						/* sizeof(unsigned int) == sizeof(unsigned long) */						p = __ultostr(tmp + sizeof(tmp) - 1, (unsigned long)									  va_arg(ap, unsigned long),									  radix, upcase);#endif#if defined(__UCLIBC_HAS_LONG_LONG__) || WANT_LONG_LONG_ERROR					}#endif /* defined(__UCLIBC_HAS_LONG_LONG__) || WANT_LONG_LONG_ERROR */					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 */#if defined(__UCLIBC_HAS_LONG_LONG__) || WANT_LONG_LONG_ERROR					if (lval >= 2) {#if defined(__UCLIBC_HAS_LONG_LONG__)						p = __lltostr(tmp + sizeof(tmp) - 1,									  va_arg(ap, long long), 10, 0);#else						(void) va_arg(ap, long long); /* carry on */						p = (char *) ll_err;#endif /* defined(__UCLIBC_HAS_LONG_LONG__) */					} else {#endif /* defined(__UCLIBC_HAS_LONG_LONG__) || WANT_LONG_LONG_ERROR */#if INT_MAX != LONG_MAX						/* sizeof(int) != sizeof(long) */						p = __ltostr(tmp + sizeof(tmp) - 1, (long)									 ((lval)									  ? va_arg(ap, long)									  : va_arg(ap, int)), 10, 0);#else						/* sizeof(int) == sizeof(long) */						p = __ltostr(tmp + sizeof(tmp) - 1, (long)									 va_arg(ap, long), 10, 0);#endif#if defined(__UCLIBC_HAS_LONG_LONG__) || WANT_LONG_LONG_ERROR					}#endif /* defined(__UCLIBC_HAS_LONG_LONG__) || WANT_LONG_LONG_ERROR */				} 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)";						}					}#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__)					if (preci < 0) {						preci = 6;					}					cnt += __dtostr(op, 									(max_size > cnt ? max_size - cnt : 0),									(long double) ((lval > 1)									 ? va_arg(ap, long double)									 : va_arg(ap, double)),									flag, width,  preci, *fmt);					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++ ) { }				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;						}						if (++cnt < max_size) {							putc(ch, op);						}						if ((ch == '\n') && (buffer_mode == _IOLBF)) {							fflush(op);						}					}				}				goto nextfmt;			}			fmt = fmt0;	/* this was an illegal format */		}		charout:		if (++cnt < max_size) {			putc(*fmt, op);	/* normal char out */		}		if ((*fmt == '\n') && (buffer_mode == _IOLBF)) {			fflush(op);		}	nextfmt:		++fmt;	}	op->mode |= buffer_mode;	if (buffer_mode == _IOLBF) {		op->bufwrite = op->bufpos;	}	if (ferror(op)) {		cnt = -1;	}	return (cnt);}#endif

⌨️ 快捷键说明

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