orton_runner/lib/my_stdio/vfprintf_get_size.c

84 lines
1.9 KiB
C

/*
** EPITECH PROJECT, 2018
** task01
** File description:
** I do task
*/
#include "lib/my_stdio.h"
static void vfprintf_get_sign(printf_t *print)
{
intmax_t value;
value = (intmax_t)print->value;
if (value < 0){
print->value = (uintmax_t)(-value);
print->str_width++;
print->sign = '-';
return;
}
if (print->mode_flags & PRINT_MODE_PLUS){
print->str_width++;
print->sign = '+';
return;
}
if (print->mode_flags & PRINT_MODE_SPACE){
print->str_width++;
print->sign = ' ';
}
}
static void vfprintf_get_size_unsigned(printf_t *print)
{
uintmax_t value;
if (print->type & PRINT_TYPE_CHAR)
value = MY_UCHAR_MAX;
if (print->type & PRINT_TYPE_SINT)
value = MY_USHORT_MAX;
if (print->type & PRINT_TYPE_LONG)
value = MY_ULONG_MAX;
if (print->type & PRINT_TYPE_PTRD)
value = MY_PTRDIFF_MAX;
if (print->type & PRINT_TYPE_LLONG)
value = MY_ULLONG_MAX;
if (!print->type)
value = MY_UINT_MAX;
while (value){
value /= print->base;
print->nbr_width++;
print->str_width++;
}
}
static void vfprintf_get_size_signed(printf_t *print)
{
intmax_t value;
value = (intmax_t)print->value;
if (!value){
print->nbr_width = 1;
print->str_width++;
return;
}
while (value){
value /= print->base;
print->nbr_width++;
print->str_width++;
}
}
void vfprintf_get_size(printf_t *print, char type)
{
vfprintf_get_sign(print);
if (type == 'x' || type == 'X' || type == 'p' || type == 'o'
|| type == 'b' || type == 'u'){
vfprintf_get_size_unsigned(print);
print->str_width += 2;
}
else
vfprintf_get_size_signed(print);
if (print->str_width < print->precision)
print->str_width = print->precision;
}