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

📄 b_print.c

📁 开源的ssl算法openssl,版本0.9.8H
💻 C
📖 第 1 页 / 共 2 页
字号:
    }    *truncated = (currlen > *maxlen - 1);    if (*truncated)        currlen = *maxlen - 1;    doapr_outch(sbuffer, buffer, &currlen, maxlen, '\0');    *retlen = currlen - 1;    return;}static voidfmtstr(    char **sbuffer,    char **buffer,    size_t *currlen,    size_t *maxlen,    const char *value,    int flags,    int min,    int max){    int padlen, strln;    int cnt = 0;    if (value == 0)        value = "<NULL>";    for (strln = 0; value[strln]; ++strln)        ;    padlen = min - strln;    if (padlen < 0)        padlen = 0;    if (flags & DP_F_MINUS)        padlen = -padlen;    while ((padlen > 0) && (cnt < max)) {        doapr_outch(sbuffer, buffer, currlen, maxlen, ' ');        --padlen;        ++cnt;    }    while (*value && (cnt < max)) {        doapr_outch(sbuffer, buffer, currlen, maxlen, *value++);        ++cnt;    }    while ((padlen < 0) && (cnt < max)) {        doapr_outch(sbuffer, buffer, currlen, maxlen, ' ');        ++padlen;        ++cnt;    }}static voidfmtint(    char **sbuffer,    char **buffer,    size_t *currlen,    size_t *maxlen,    LLONG value,    int base,    int min,    int max,    int flags){    int signvalue = 0;    const char *prefix = "";    unsigned LLONG uvalue;    char convert[DECIMAL_SIZE(value)+3];    int place = 0;    int spadlen = 0;    int zpadlen = 0;    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)            signvalue = '+';        else if (flags & DP_F_SPACE)            signvalue = ' ';    }    if (flags & DP_F_NUM) {	if (base == 8) prefix = "0";	if (base == 16) prefix = "0x";    }    if (flags & DP_F_UP)        caps = 1;    do {        convert[place++] =            (caps ? "0123456789ABCDEF" : "0123456789abcdef")            [uvalue % (unsigned) base];        uvalue = (uvalue / (unsigned) base);    } while (uvalue && (place < (int)sizeof(convert)));    if (place == sizeof(convert))        place--;    convert[place] = 0;    zpadlen = max - place;    spadlen = min - OSSL_MAX(max, place) - (signvalue ? 1 : 0) - strlen(prefix);    if (zpadlen < 0)        zpadlen = 0;    if (spadlen < 0)        spadlen = 0;    if (flags & DP_F_ZERO) {        zpadlen = OSSL_MAX(zpadlen, spadlen);        spadlen = 0;    }    if (flags & DP_F_MINUS)        spadlen = -spadlen;    /* spaces */    while (spadlen > 0) {        doapr_outch(sbuffer, buffer, currlen, maxlen, ' ');        --spadlen;    }    /* sign */    if (signvalue)        doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue);    /* prefix */    while (*prefix) {	doapr_outch(sbuffer, buffer, currlen, maxlen, *prefix);	prefix++;    }    /* zeros */    if (zpadlen > 0) {        while (zpadlen > 0) {            doapr_outch(sbuffer, buffer, currlen, maxlen, '0');            --zpadlen;        }    }    /* digits */    while (place > 0)        doapr_outch(sbuffer, buffer, currlen, maxlen, convert[--place]);    /* left justified spaces */    while (spadlen < 0) {        doapr_outch(sbuffer, buffer, currlen, maxlen, ' ');        ++spadlen;    }    return;}static LDOUBLEabs_val(LDOUBLE value){    LDOUBLE result = value;    if (value < 0)        result = -value;    return result;}static LDOUBLEpow_10(int in_exp){    LDOUBLE result = 1;    while (in_exp) {        result *= 10;        in_exp--;    }    return result;}static longroundv(LDOUBLE value){    long intpart;    intpart = (long) value;    value = value - intpart;    if (value >= 0.5)        intpart++;    return intpart;}static voidfmtfp(    char **sbuffer,    char **buffer,    size_t *currlen,    size_t *maxlen,    LDOUBLE fvalue,    int min,    int max,    int flags){    int signvalue = 0;    LDOUBLE ufvalue;    char iconvert[20];    char fconvert[20];    int iplace = 0;    int fplace = 0;    int padlen = 0;    int zpadlen = 0;    int caps = 0;    long intpart;    long fracpart;    long max10;    if (max < 0)        max = 6;    ufvalue = abs_val(fvalue);    if (fvalue < 0)        signvalue = '-';    else if (flags & DP_F_PLUS)        signvalue = '+';    else if (flags & DP_F_SPACE)        signvalue = ' ';    intpart = (long)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 */    max10 = roundv(pow_10(max));    fracpart = roundv(pow_10(max) * (ufvalue - intpart));    if (fracpart >= max10) {        intpart++;        fracpart -= max10;    }    /* convert integer part */    do {        iconvert[iplace++] =            (caps ? "0123456789ABCDEF"              : "0123456789abcdef")[intpart % 10];        intpart = (intpart / 10);    } while (intpart && (iplace < (int)sizeof(iconvert)));    if (iplace == sizeof iconvert)        iplace--;    iconvert[iplace] = 0;    /* convert fractional part */    do {        fconvert[fplace++] =            (caps ? "0123456789ABCDEF"              : "0123456789abcdef")[fracpart % 10];        fracpart = (fracpart / 10);    } while (fplace < max);    if (fplace == sizeof fconvert)        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;    if ((flags & DP_F_ZERO) && (padlen > 0)) {        if (signvalue) {            doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue);            --padlen;            signvalue = 0;        }        while (padlen > 0) {            doapr_outch(sbuffer, buffer, currlen, maxlen, '0');            --padlen;        }    }    while (padlen > 0) {        doapr_outch(sbuffer, buffer, currlen, maxlen, ' ');        --padlen;    }    if (signvalue)        doapr_outch(sbuffer, buffer, currlen, maxlen, signvalue);    while (iplace > 0)        doapr_outch(sbuffer, buffer, currlen, maxlen, iconvert[--iplace]);    /*     * Decimal point. This should probably use locale to find the correct     * char to print out.     */    if (max > 0 || (flags & DP_F_NUM)) {        doapr_outch(sbuffer, buffer, currlen, maxlen, '.');        while (fplace > 0)            doapr_outch(sbuffer, buffer, currlen, maxlen, fconvert[--fplace]);    }    while (zpadlen > 0) {        doapr_outch(sbuffer, buffer, currlen, maxlen, '0');        --zpadlen;    }    while (padlen < 0) {        doapr_outch(sbuffer, buffer, currlen, maxlen, ' ');        ++padlen;    }}static voiddoapr_outch(    char **sbuffer,    char **buffer,    size_t *currlen,    size_t *maxlen,    int c){    /* If we haven't at least one buffer, someone has doe a big booboo */    assert(*sbuffer != NULL || buffer != NULL);    if (buffer) {	while (*currlen >= *maxlen) {	    if (*buffer == NULL) {		if (*maxlen == 0)		    *maxlen = 1024;		*buffer = OPENSSL_malloc(*maxlen);		if (*currlen > 0) {		    assert(*sbuffer != NULL);		    memcpy(*buffer, *sbuffer, *currlen);		}		*sbuffer = NULL;	    } else {		*maxlen += 1024;		*buffer = OPENSSL_realloc(*buffer, *maxlen);	    }	}	/* What to do if *buffer is NULL? */	assert(*sbuffer != NULL || *buffer != NULL);    }    if (*currlen < *maxlen) {	if (*sbuffer)	    (*sbuffer)[(*currlen)++] = (char)c;	else	    (*buffer)[(*currlen)++] = (char)c;    }    return;}/***************************************************************************/int BIO_printf (BIO *bio, const char *format, ...)	{	va_list args;	int ret;	va_start(args, format);	ret = BIO_vprintf(bio, format, args);	va_end(args);	return(ret);	}int BIO_vprintf (BIO *bio, const char *format, va_list args)	{	int ret;	size_t retlen;	char hugebuf[1024*2];	/* Was previously 10k, which is unreasonable				   in small-stack environments, like threads				   or DOS programs. */	char *hugebufp = hugebuf;	size_t hugebufsize = sizeof(hugebuf);	char *dynbuf = NULL;	int ignored;	dynbuf = NULL;	CRYPTO_push_info("doapr()");	_dopr(&hugebufp, &dynbuf, &hugebufsize,		&retlen, &ignored, format, args);	if (dynbuf)		{		ret=BIO_write(bio, dynbuf, (int)retlen);		OPENSSL_free(dynbuf);		}	else		{		ret=BIO_write(bio, hugebuf, (int)retlen);		}	CRYPTO_pop_info();	return(ret);	}/* As snprintf is not available everywhere, we provide our own implementation. * This function has nothing to do with BIOs, but it's closely related * to BIO_printf, and we need *some* name prefix ... * (XXX  the function should be renamed, but to what?) */int BIO_snprintf(char *buf, size_t n, const char *format, ...)	{	va_list args;	int ret;	va_start(args, format);	ret = BIO_vsnprintf(buf, n, format, args);	va_end(args);	return(ret);	}int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args)	{	size_t retlen;	int truncated;	_dopr(&buf, NULL, &n, &retlen, &truncated, format, args);	if (truncated)		/* In case of truncation, return -1 like traditional snprintf.		 * (Current drafts for ISO/IEC 9899 say snprintf should return		 * the number of characters that would have been written,		 * had the buffer been large enough.) */		return -1;	else		return (retlen <= INT_MAX) ? (int)retlen : -1;	}

⌨️ 快捷键说明

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