/*
** EPITECH PROJECT, 2018
** task01
** File description:
** I do task
*/
#include "lib/my_stdio.h"

/*                                    */
/* it's a bit ugly but it's the best  */
/* maniere to get exacly what we want */
/*                                    */
static void get_signed_arg(printf_t *print)
{
    if (print->type & PRINT_TYPE_CHAR)
        print->value = (uintmax_t)(char)print->value;
    if (!print->type)
        print->value = (uintmax_t)(int)print->value;
    if (print->type & PRINT_TYPE_INTM)
        print->value = (uintmax_t)(intmax_t)print->value;
    if (print->type & PRINT_TYPE_SINT || print->type & PRINT_TYPE_SIZE)
        print->value = (uintmax_t)(short int)print->value;
    if (print->type & PRINT_TYPE_LLONG)
        print->value = (uintmax_t)(long long int)print->value;
    if (print->type & PRINT_TYPE_LONG)
        print->value = (uintmax_t)(long int)print->value;
    if (print->type & PRINT_TYPE_PTRD)
        print->value = (uintmax_t)(ptrdiff_t)print->value;
}

static void get_unsigned_arg(printf_t *print)
{
    if (print->type & PRINT_TYPE_CHAR)
        print->value = (uintmax_t)(unsigned char)print->value;
    if (!print->type)
        print->value = (uintmax_t)(unsigned int)print->value;
    if (print->type & PRINT_TYPE_SINT || print->type & PRINT_TYPE_SIZE)
        print->value = (uintmax_t)(unsigned short int)print->value;
    if (print->type & PRINT_TYPE_LLONG)
        print->value = (uintmax_t)(unsigned long long int)print->value;
    if (print->type & PRINT_TYPE_LONG)
        print->value = (intmax_t)(unsigned long int)print->value;
    if (print->type & PRINT_TYPE_PTRD)
        print->value = (uintmax_t)(ptrdiff_t)print->value;
}

void vfprintf_get_arg(printf_t *print, char type)
{
    print->value = va_arg(print->ap, uintmax_t);
    if (type == 'o' || type == 'x' || type == 'X'
        || type == 'p' || type == 'b' || type == 'u')
        get_unsigned_arg(print);
    else
        get_signed_arg(print);
}
