216 MOS_LIB_ASSERT(conv ==
'd' || conv ==
'i' || conv ==
'o' || conv ==
'u' || conv ==
'x' || conv ==
'X');
220 if (conv ==
'd' || conv ==
'i' || conv ==
'u')
224 mos_warn(
"'#' flag is ignored in d, i mode");
225 pflags->
hash =
false;
235 bool upper_case =
false;
236 const char *hex_digits =
NULL;
238 bool is_unsigned_ouxX = conv ==
'o' || conv ==
'u' || conv ==
'x' || conv ==
'X';
239 if (is_unsigned_ouxX)
243 mos_warn(
"'+' flag is ignored in unsigned mode");
248 mos_warn(
"' ' flag is ignored in unsigned mode");
252 base = (conv ==
'o' ? BASE_8 : (conv ==
'u' ? BASE_10 : BASE_16));
253 upper_case = conv ==
'X';
258 case LM_hh: number = (
u8) number;
break;
259 case LM__h: number = (
u16) number;
break;
261 case LM__l: number = (
u32) number;
break;
262 case LM_ll: number = (
u64) number;
break;
264 case LM__t: number = (ptrdiff_t) number;
break;
265 case LM__L: number = (
u64) number;
break;
279 char num_prefix_buf[5] = { 0 };
280 char num_content_buf[32] = { 0 };
281 size_t num_content_len = 32;
284 if (base == BASE_10 && !is_unsigned_ouxX)
286 bool is_negative = ((
s64) number) < 0;
288 number = -(
s64) number, num_prefix_buf[0] =
'-';
290 num_prefix_buf[0] =
'+';
292 num_prefix_buf[0] =
' ';
294 else if (base == BASE_16 && pflags->
hash)
300 num_prefix_buf[0] =
'0';
301 num_prefix_buf[1] = upper_case ?
'X' :
'x';
304 else if (base == BASE_8 && pflags->
hash)
317 num_content_buf[0] =
'0';
321 char *pnumberbuf = num_content_buf;
327 pnumberbuf +=
buf_putchar(pnumberbuf,
'0' + (
char) (number % base), &num_content_len), number /= base;
331 pnumberbuf +=
buf_putchar(pnumberbuf, hex_digits[number % 16], &num_content_len), number /= 16;
340 if (base == BASE_8 && pflags->
hash)
343 if (pflags->
precision - n_digits <= 0 && num_content_buf[0] !=
'0')
344 num_prefix_buf[0] =
'0';
348 s32 precision_padding = std::max(pflags->
precision - n_digits, 0);
349 s32 width_to_pad = std::max(pflags->
minimum_width -
strlen(num_prefix_buf) - precision_padding - n_digits, 0lu);
351 char *pnum_prefix = num_prefix_buf;
352 char *pnum_content = num_content_buf + n_digits;
357 while (precision_padding-- > 0)
359 while (pnum_content > num_content_buf)
361 while (width_to_pad-- > 0)
371 while (width_to_pad-- > 0)
377 while (width_to_pad-- > 0)
382 while (precision_padding-- > 0)
384 while (pnum_content > num_content_buf)
size_t vsnprintf_do_pointer_kernel(char *buf, size_t *size, const char **pformat, ptr_t ptr)
Kernel's extension to vsnprintf, 'p' format specifier.