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

📄 bsd-snprintf.c

📁 OpenSSL Source code for SFTP, SSH, and many others
💻 C
📖 第 1 页 / 共 2 页
字号:
		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;	int place = 0;	int spadlen = 0; /* amount to space pad */	int zpadlen = 0; /* amount to zero pad */	int caps = 0;  	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];	char fconvert[20];	int signvalue = 0;	int iplace = 0;	int fplace = 0;	int padlen = 0; /* amount to pad */	int zpadlen = 0; 	int caps = 0;	long intpart;	long 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));}#ifdef TEST_SNPRINTFint main(void){#define LONG_STRING 1024	char buf1[LONG_STRING];	char buf2[LONG_STRING];	char *fp_fmt[] = {		"%-1.5f",		"%1.5f",		"%123.9f",		"%10.5f",		"% 10.5f",		"%+22.9f",		"%+4.9f",		"%01.3f",		"%4f",		"%3.1f",		"%3.2f",		NULL	};	double fp_nums[] = { 		-1.5, 		134.21, 		91340.2, 		341.1234, 		0203.9, 		0.96, 		0.996, 		0.9996, 		1.996, 		4.136, 		0	};	char *int_fmt[] = {		"%-1.5d",		"%1.5d",		"%123.9d",		"%5.5d",		"%10.5d",		"% 10.5d",		"%+22.33d",		"%01.3d",		"%4d",		"%lld",		"%qd",		NULL	};	long long int_nums[] = { -1, 134, 91340, 341, 0203, 0, 9999999 };	int x, y;	int fail = 0;	int num = 0;	printf("Testing snprintf format codes against system sprintf...\n");	for (x = 0; fp_fmt[x] != NULL ; x++) {		for (y = 0; fp_nums[y] != 0 ; y++) {			snprintf(buf1, sizeof (buf1), fp_fmt[x], fp_nums[y]);			sprintf (buf2, fp_fmt[x], fp_nums[y]);			if (strcmp (buf1, buf2)) {				printf("snprintf doesn't match Format: %s\n\t"                                       "snprintf = %s\n\tsprintf  = %s\n", 					fp_fmt[x], buf1, buf2);				fail++;			}			num++;		}	}	for (x = 0; int_fmt[x] != NULL ; x++) {		for (y = 0; int_nums[y] != 0 ; y++) {			snprintf(buf1, sizeof (buf1), int_fmt[x], int_nums[y]);			sprintf(buf2, int_fmt[x], int_nums[y]);			if (strcmp (buf1, buf2)) {				printf("snprintf doesn't match Format: %s\n\t"				       "snprintf = %s\n\tsprintf  = %s\n", 					int_fmt[x], buf1, buf2);				fail++;			}			num++;		}	}	printf("%d tests failed out of %d.\n", fail, num);	return(0);}#endif /* SNPRINTF_TEST */#endif /* !HAVE_SNPRINTF */

⌨️ 快捷键说明

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