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

📄 bsd-snprintf.c

📁 OpenSSH 是 SSH (Secure SHell) 协议的免费开源实现。它用安全、加密的网络连接工具代替了 telnet、ftp、 rlogin、rsh 和 rcp 工具。OpenSSH 支持
💻 C
📖 第 1 页 / 共 2 页
字号:
					long long *num;					num = va_arg(args, long long *);					*num = currlen;				} else {					int *num;					num = va_arg(args, int *);					*num = currlen;				}				break;			case '%':				dopr_outch(buffer, &currlen, maxlen, ch);				break;			case 'w': /* not supported yet, treat as next char */				ch = *format++;				break;			default: /* Unknown, skip */			break;			}			ch = *format++;			state = DP_S_DEFAULT;			flags = cflags = min = 0;			max = -1;			break;		case DP_S_DONE:			break;		default: /* hmm? */			break; /* some picky compilers need this */		}	}	if (currlen < maxlen - 1) 		buffer[currlen] = '\0';	else 		buffer[maxlen - 1] = '\0';}static voidfmtstr(char *buffer, size_t *currlen, size_t maxlen,    char *value, int flags, int min, int max){	int cnt = 0, padlen, strln;     /* amount to pad */  	if (value == 0) 		value = "<NULL>";	for (strln = 0; strln < max && value[strln]; ++strln); /* strlen */	padlen = min - strln;	if (padlen < 0) 		padlen = 0;	if (flags & DP_F_MINUS) 		padlen = -padlen; /* Left Justify */	while ((padlen > 0) && (cnt < max)) {		dopr_outch(buffer, currlen, maxlen, ' ');		--padlen;		++cnt;	}	while (*value && (cnt < max)) {		dopr_outch(buffer, currlen, maxlen, *value++);		++cnt;	}	while ((padlen < 0) && (cnt < max)) {		dopr_outch(buffer, currlen, maxlen, ' ');		++padlen;		++cnt;	}}/* Have to handle DP_F_NUM (ie 0x and 0 alternates) */static void fmtint(char *buffer, size_t *currlen, size_t maxlen,    long value, int base, int min, int max, int flags){	unsigned long uvalue;	char convert[20];	int signvalue = 0, place = 0, caps = 0;	int spadlen = 0; /* amount to space pad */	int zpadlen = 0; /* amount to zero pad */  	if (max < 0)		max = 0;	uvalue = value;	if (!(flags & DP_F_UNSIGNED)) {		if (value < 0) {			signvalue = '-';			uvalue = -value;		} else if (flags & DP_F_PLUS)  /* Do a sign (+/i) */			signvalue = '+';		else if (flags & DP_F_SPACE)			signvalue = ' ';	}  	if (flags & DP_F_UP) 		caps = 1; /* Should characters be upper case? */	do {		convert[place++] =		    (caps ? "0123456789ABCDEF" : "0123456789abcdef")		    [uvalue % (unsigned)base];		uvalue = (uvalue / (unsigned)base );	} while (uvalue && (place < 20));	if (place == 20) 		place--;	convert[place] = 0;	zpadlen = max - place;	spadlen = min - MAX (max, place) - (signvalue ? 1 : 0);	if (zpadlen < 0)		zpadlen = 0;	if (spadlen < 0)		spadlen = 0;	if (flags & DP_F_ZERO) {		zpadlen = MAX(zpadlen, spadlen);		spadlen = 0;	}	if (flags & DP_F_MINUS) 		spadlen = -spadlen; /* Left Justifty */	/* Spaces */	while (spadlen > 0) {		dopr_outch(buffer, currlen, maxlen, ' ');		--spadlen;	}	/* Sign */	if (signvalue) 		dopr_outch(buffer, currlen, maxlen, signvalue);	/* Zeros */	if (zpadlen > 0) {		while (zpadlen > 0) {			dopr_outch(buffer, currlen, maxlen, '0');			--zpadlen;		}	}	/* Digits */	while (place > 0) 		dopr_outch(buffer, currlen, maxlen, convert[--place]);  	/* Left Justified spaces */	while (spadlen < 0) {		dopr_outch (buffer, currlen, maxlen, ' ');		++spadlen;	}}static long double pow10(int exp){	long double result = 1;	while (exp) {		result *= 10;		exp--;	}  	return result;}static long round(long double value){	long intpart = value;	value -= intpart;	if (value >= 0.5)		intpart++;	return intpart;}static void fmtfp(char *buffer, size_t *currlen, size_t maxlen, long double fvalue,       int min, int max, int flags){	char iconvert[20], fconvert[20];	int signvalue = 0, iplace = 0, fplace = 0;	int padlen = 0; /* amount to pad */	int zpadlen = 0, caps = 0;	long intpart, fracpart;	long double ufvalue;  	/* 	 * AIX manpage says the default is 0, but Solaris says the default	 * is 6, and sprintf on AIX defaults to 6	 */	if (max < 0)		max = 6;	ufvalue = abs_val(fvalue);	if (fvalue < 0)		signvalue = '-';	else if (flags & DP_F_PLUS)  /* Do a sign (+/i) */		signvalue = '+';	else if (flags & DP_F_SPACE)		signvalue = ' ';	intpart = ufvalue;	/* 	 * Sorry, we only support 9 digits past the decimal because of our 	 * conversion method	 */	if (max > 9)		max = 9;	/* We "cheat" by converting the fractional part to integer by	 * multiplying by a factor of 10	 */	fracpart = round((pow10 (max)) * (ufvalue - intpart));	if (fracpart >= pow10 (max)) {		intpart++;		fracpart -= pow10 (max);	}	/* Convert integer part */	do {		iconvert[iplace++] =		    (caps ? "0123456789ABCDEF" : "0123456789abcdef")		    [intpart % 10];		intpart = (intpart / 10);	} while(intpart && (iplace < 20));	if (iplace == 20) 		iplace--;	iconvert[iplace] = 0;	/* Convert fractional part */	do {		fconvert[fplace++] =		    (caps ? "0123456789ABCDEF" : "0123456789abcdef")		    [fracpart % 10];		fracpart = (fracpart / 10);	} while(fracpart && (fplace < 20));	if (fplace == 20) 		fplace--;	fconvert[fplace] = 0;	/* -1 for decimal point, another -1 if we are printing a sign */	padlen = min - iplace - max - 1 - ((signvalue) ? 1 : 0); 	zpadlen = max - fplace;	if (zpadlen < 0)		zpadlen = 0;	if (padlen < 0) 		padlen = 0;	if (flags & DP_F_MINUS) 		padlen = -padlen; /* Left Justifty */	if ((flags & DP_F_ZERO) && (padlen > 0)) {		if (signvalue) {			dopr_outch(buffer, currlen, maxlen, signvalue);			--padlen;			signvalue = 0;		}		while (padlen > 0) {			dopr_outch(buffer, currlen, maxlen, '0');			--padlen;		}	}	while (padlen > 0) {		dopr_outch(buffer, currlen, maxlen, ' ');		--padlen;	}	if (signvalue) 		dopr_outch(buffer, currlen, maxlen, signvalue);	while (iplace > 0) 		dopr_outch(buffer, currlen, maxlen, iconvert[--iplace]);	/*	 * Decimal point.  This should probably use locale to find the 	 * correct char to print out.	 */	dopr_outch(buffer, currlen, maxlen, '.');	while (fplace > 0) 		dopr_outch(buffer, currlen, maxlen, fconvert[--fplace]);	while (zpadlen > 0) {		dopr_outch(buffer, currlen, maxlen, '0');		--zpadlen;	}	while (padlen < 0) {		dopr_outch(buffer, currlen, maxlen, ' ');		++padlen;	}}static void dopr_outch(char *buffer, size_t *currlen, size_t maxlen, char c){	if (*currlen < maxlen)		buffer[(*currlen)++] = c;}#endif /* !defined(HAVE_SNPRINTF) || !defined(HAVE_VSNPRINTF) */#ifndef HAVE_VSNPRINTFint vsnprintf(char *str, size_t count, const char *fmt, va_list args){	str[0] = 0;	dopr(str, count, fmt, args);	return(strlen(str));}#endif /* !HAVE_VSNPRINTF */#ifndef HAVE_SNPRINTFint snprintf(char *str,size_t count,const char *fmt,...){	va_list ap;	va_start(ap, fmt);	(void) vsnprintf(str, count, fmt, ap);	va_end(ap);	return(strlen(str));}#endif /* !HAVE_SNPRINTF */

⌨️ 快捷键说明

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