apr_status_t filepath_root_case(char **rootpath, char *root, apr_pool_t *p) { if (root[0] && apr_islower(root[0]) && root[1] == ':') { *rootpath = apr_pstrdup(p, root); (*rootpath)[0] = apr_toupper((*rootpath)[0]); } else { *rootpath = root; } return APR_SUCCESS; }
/* * Do format conversion placing the output in buffer * 本函数没有调用任何外部函数,所以它是自包含的 */ APR_DECLARE(int) apr_vformatter(int (*flush_func)(apr_vformatter_buff_t *), apr_vformatter_buff_t *vbuff, const char *fmt, va_list ap) { register char *sp; register char *bep; register int cc = 0; register apr_size_t i; register char *s = NULL; char *q; apr_size_t s_len = 0; register apr_size_t min_width = 0; apr_size_t precision = 0; enum { LEFT, RIGHT } adjust; char pad_char; char prefix_char; double fp_num; apr_int64_t i_quad = 0; apr_uint64_t ui_quad; apr_int32_t i_num = 0; apr_uint32_t ui_num = 0; char num_buf[NUM_BUF_SIZE]; char char_buf[2]; /* for printing %% and %<unknown> */ enum var_type_enum { IS_QUAD, IS_LONG, IS_SHORT, IS_INT }; enum var_type_enum var_type = IS_INT; /* * Flag variables */ boolean_e alternate_form; boolean_e print_sign; boolean_e print_blank; boolean_e adjust_precision; boolean_e adjust_width; int is_negative; sp = vbuff->curpos; bep = vbuff->endpos; while (*fmt) { if (*fmt != '%') { INS_CHAR(*fmt, sp, bep, cc); } else { /* * Default variable settings */ boolean_e print_something = YES; adjust = RIGHT; alternate_form = print_sign = print_blank = NO; pad_char = ' '; prefix_char = NUL; fmt++; /* * Try to avoid checking for flags, width or precision */ if (!apr_islower(*fmt)) { /* * Recognize flags: -, #, BLANK, + */ for (;; fmt++) { if (*fmt == '-') adjust = LEFT; else if (*fmt == '+') print_sign = YES; else if (*fmt == '#') alternate_form = YES; else if (*fmt == ' ') print_blank = YES; else if (*fmt == '0') pad_char = '0'; else break; } /* * Check if a width was specified */ if (apr_isdigit(*fmt)) { STR_TO_DEC(fmt, min_width); adjust_width = YES; } else if (*fmt == '*') { int v = va_arg(ap, int); fmt++; adjust_width = YES; if (v < 0) { adjust = LEFT; min_width = (apr_size_t)(-v); } else min_width = (apr_size_t)v; } else adjust_width = NO; /* * Check if a precision was specified */ if (*fmt == '.') { adjust_precision = YES; fmt++; if (apr_isdigit(*fmt)) { STR_TO_DEC(fmt, precision); } else if (*fmt == '*') { int v = va_arg(ap, int); fmt++; precision = (v < 0) ? 0 : (apr_size_t)v; } else