ap_snprintf.c

来自「以便Apache与其他服务进行整合 Mod_JK安装」· C语言 代码 · 共 1,179 行 · 第 1/3 页

C
1,179
字号
                    s = conv_10_quad(i_quad, 1, &is_negative,                            &num_buf[NUM_BUF_SIZE], &s_len);                }                else {                    if (var_type == IS_LONG)                        i_num = (wide_int) va_arg(ap, u_wide_int);                    else if (var_type == IS_SHORT)                        i_num = (wide_int) (unsigned short) va_arg(ap, unsigned int);                    else                        i_num = (wide_int) va_arg(ap, unsigned int);                    s = conv_10(i_num, 1, &is_negative,                            &num_buf[NUM_BUF_SIZE], &s_len);                }                FIX_PRECISION(adjust_precision, precision, s, s_len);                break;            case 'd':            case 'i':                if (var_type == IS_QUAD) {                    i_quad = va_arg(ap, widest_int);                    s = conv_10_quad(i_quad, 0, &is_negative,                            &num_buf[NUM_BUF_SIZE], &s_len);                }                else {                    if (var_type == IS_LONG)                        i_num = (wide_int) va_arg(ap, wide_int);                    else if (var_type == IS_SHORT)                        i_num = (wide_int) (short) va_arg(ap, int);                    else                        i_num = (wide_int) va_arg(ap, int);                    s = conv_10(i_num, 0, &is_negative,                            &num_buf[NUM_BUF_SIZE], &s_len);                }                FIX_PRECISION(adjust_precision, precision, s, s_len);                if (is_negative)                    prefix_char = '-';                else if (print_sign)                    prefix_char = '+';                else if (print_blank)                    prefix_char = ' ';                break;            case 'o':                if (var_type == IS_QUAD) {                    ui_quad = va_arg(ap, u_widest_int);                    s = conv_p2_quad(ui_quad, 3, *fmt,                            &num_buf[NUM_BUF_SIZE], &s_len);                }                else {                    if (var_type == IS_LONG)                        ui_num = (u_wide_int) va_arg(ap, u_wide_int);                    else if (var_type == IS_SHORT)                        ui_num = (u_wide_int) (unsigned short) va_arg(ap, unsigned int);                    else                        ui_num = (u_wide_int) va_arg(ap, unsigned int);                    s = conv_p2(ui_num, 3, *fmt,                            &num_buf[NUM_BUF_SIZE], &s_len);                }                FIX_PRECISION(adjust_precision, precision, s, s_len);                if (alternate_form && *s != '0') {                    *--s = '0';                    s_len++;                }                break;            case 'x':            case 'X':                if (var_type == IS_QUAD) {                    ui_quad = va_arg(ap, u_widest_int);                    s = conv_p2_quad(ui_quad, 4, *fmt,                            &num_buf[NUM_BUF_SIZE], &s_len);                }                else {                    if (var_type == IS_LONG)                        ui_num = (u_wide_int) va_arg(ap, u_wide_int);                    else if (var_type == IS_SHORT)                        ui_num = (u_wide_int) (unsigned short) va_arg(ap, unsigned int);                    else                        ui_num = (u_wide_int) va_arg(ap, unsigned int);                    s = conv_p2(ui_num, 4, *fmt,                            &num_buf[NUM_BUF_SIZE], &s_len);                }                FIX_PRECISION(adjust_precision, precision, s, s_len);                if (alternate_form && i_num != 0) {                    *--s = *fmt;        /* 'x' or 'X' */                    *--s = '0';                    s_len += 2;                }                break;            case 's':                s = va_arg(ap, char *);                if (s != NULL) {                    s_len = strlen(s);                    if (adjust_precision && precision < s_len)                        s_len = precision;                }                else {                    s = S_NULL;                    s_len = S_NULL_LEN;                }                pad_char = ' ';                break;            case 'f':            case 'e':            case 'E':                fp_num = va_arg(ap, double);                /*                 * * We use &num_buf[ 1 ], so that we have room for the sign                 */#ifdef HAVE_ISNAN                if (isnan(fp_num)) {                    s = "nan";                    s_len = 3;                }                else#endif#ifdef HAVE_ISINF                if (isinf(fp_num)) {                    s = "inf";                    s_len = 3;                }                else#endif                {                    s = conv_fp(*fmt, fp_num, alternate_form,                            (adjust_precision == NO) ? FLOAT_DIGITS : precision,                                &is_negative, &num_buf[1], &s_len);                    if (is_negative)                        prefix_char = '-';                    else if (print_sign)                        prefix_char = '+';                    else if (print_blank)                        prefix_char = ' ';                }                break;            case 'g':            case 'G':                if (adjust_precision == NO)                    precision = FLOAT_DIGITS;                else if (precision == 0)                    precision = 1;                /*                 * * We use &num_buf[ 1 ], so that we have room for the sign                 */                s = ap_gcvt(va_arg(ap, double), precision, &num_buf[1],                            alternate_form);                if (*s == '-')                    prefix_char = *s++;                else if (print_sign)                    prefix_char = '+';                else if (print_blank)                    prefix_char = ' ';                s_len = strlen(s);                if (alternate_form && (q = strchr(s, '.')) == NULL) {                    s[s_len++] = '.';                    s[s_len] = '\0'; /* delimit for following strchr() */                }                if (*fmt == 'G' && (q = strchr(s, 'e')) != NULL)                    *q = 'E';                break;            case 'c':                char_buf[0] = (char) (va_arg(ap, int));                s = &char_buf[0];                s_len = 1;                pad_char = ' ';                break;            case '%':                char_buf[0] = '%';                s = &char_buf[0];                s_len = 1;                pad_char = ' ';                break;            case 'n':                if (var_type == IS_QUAD)                    *(va_arg(ap, widest_int *)) = cc;                else if (var_type == IS_LONG)                    *(va_arg(ap, long *)) = cc;                else if (var_type == IS_SHORT)                    *(va_arg(ap, short *)) = cc;                else                    *(va_arg(ap, int *)) = cc;                break;                /*                 * This is where we extend the printf format, with a second                 * type specifier                 */            case 'p':                switch(*++fmt) {                    /*                     * If the pointer size is equal to or smaller than the size                     * of the largest unsigned int, we convert the pointer to a                     * hex number, otherwise we print "%p" to indicate that we                     * don't handle "%p".                     */                case 'p':#ifdef AP_VOID_P_IS_QUAD                    if (sizeof(void *) <= sizeof(u_widest_int)) {                        ui_quad = (u_widest_int) va_arg(ap, void *);                        s = conv_p2_quad(ui_quad, 4, 'x',                                &num_buf[NUM_BUF_SIZE], &s_len);                    }#else                    if (sizeof(void *) <= sizeof(u_wide_int)) {                        ui_num = (u_wide_int) va_arg(ap, void *);                        s = conv_p2(ui_num, 4, 'x',                                &num_buf[NUM_BUF_SIZE], &s_len);                    }#endif                    else {                        s = "%p";                        s_len = 2;                        prefix_char = NUL;                    }                    pad_char = ' ';                    break;#ifndef BUILD_STANDALONE                    /* print a struct sockaddr_in as a.b.c.d:port */                case 'I':                    {                        struct sockaddr_in *si;                        si = va_arg(ap, struct sockaddr_in *);                        if (si != NULL) {                            s = conv_sockaddr_in(si, &num_buf[NUM_BUF_SIZE], &s_len);                            if (adjust_precision && precision < s_len)                                s_len = precision;                        }                        else {                            s = S_NULL;                            s_len = S_NULL_LEN;                        }                        pad_char = ' ';                    }                    break;                    /* print a struct in_addr as a.b.c.d */                case 'A':                    {                        struct in_addr *ia;                        ia = va_arg(ap, struct in_addr *);                        if (ia != NULL) {                            s = conv_in_addr(ia, &num_buf[NUM_BUF_SIZE], &s_len);                            if (adjust_precision && precision < s_len)                                s_len = precision;                        }                        else {                            s = S_NULL;                            s_len = S_NULL_LEN;                        }                        pad_char = ' ';                    }                    break;#endif                case NUL:                    /* if %p ends the string, oh well ignore it */                    continue;                default:                    s = "bogus %p";                    s_len = 8;                    prefix_char = NUL;                    break;                }                break;            case NUL:                /*                 * The last character of the format string was %.                 * We ignore it.                 */                continue;                /*                 * The default case is for unrecognized %'s.                 * We print %<char> to help the user identify what                 * option is not understood.                 * This is also useful in case the user wants to pass                 * the output of format_converter to another function                 * that understands some other %<char> (like syslog).                 * Note that we can't point s inside fmt because the                 * unknown <char> could be preceded by width etc.                 */            default:                char_buf[0] = '%';                char_buf[1] = *fmt;                s = char_buf;                s_len = 2;                pad_char = ' ';                break;            }            if (prefix_char != NUL && s != S_NULL && s != char_buf) {                *--s = prefix_char;                s_len++;            }            if (adjust_width && adjust == RIGHT && min_width > s_len) {                if (pad_char == '0' && prefix_char != NUL) {                    INS_CHAR(*s, sp, bep, cc);                    s++;                    s_len--;                    min_width--;                }                PAD(min_width, s_len, pad_char);            }            /*             * Print the string s.              */            for (i = s_len; i != 0; i--) {                INS_CHAR(*s, sp, bep, cc);                s++;            }            if (adjust_width && adjust == LEFT && min_width > s_len)                PAD(min_width, s_len, pad_char);        }        fmt++;    }    vbuff->curpos = sp;    return cc;}static int snprintf_flush(ap_vformatter_buff *vbuff){    /* if the buffer fills we have to abort immediately, there is no way     * to "flush" an ap_snprintf... there's nowhere to flush it to.     */    return -1;}API_EXPORT_NONSTD(int) ap_snprintf(char *buf, size_t len, const char *format,...){    int cc;    va_list ap;    ap_vformatter_buff vbuff;    if (len == 0)        return 0;    /* save one byte for nul terminator */    vbuff.curpos = buf;    vbuff.endpos = buf + len - 1;    va_start(ap, format);    cc = ap_vformatter(snprintf_flush, &vbuff, format, ap);    va_end(ap);    *vbuff.curpos = '\0';    return (cc == -1) ? len : cc;}API_EXPORT(int) ap_vsnprintf(char *buf, size_t len, const char *format,                             va_list ap){    int cc;    ap_vformatter_buff vbuff;    if (len == 0)        return 0;    /* save one byte for nul terminator */    vbuff.curpos = buf;    vbuff.endpos = buf + len - 1;    cc = ap_vformatter(snprintf_flush, &vbuff, format, ap);    *vbuff.curpos = '\0';    return (cc == -1) ? len : cc;}

⌨️ 快捷键说明

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