Corewar-Final/libft/printf/ft_printf.c
Jeremy FLEURY 748d10f4f3 push
2019-07-17 11:22:24 +02:00

78 lines
2.4 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* ft_printf.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: igarbuz <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2019/01/24 13:05:37 by igarbuz #+# #+# */
/* Updated: 2019/01/24 13:05:40 by igarbuz ### ########.fr */
/* */
/* ************************************************************************** */
#include "ft_printf.h"
static void ft_print(const char c, char *b, t_param *prm, va_list valist)
{
intmax_t arg;
double db;
long double ldb;
if (c != '%' && c != 'f')
arg = ft_arg_cast(valist, prm->p, c);
else if (c == 'f' && (prm->p >> 9 & 1))
ldb = va_arg(valist, long double);
else if (c == 'f')
db = va_arg(valist, double);
if (c == 'c' || c == 's' || c == '%')
ft_print_c_pad(c, b, prm, arg);
else if ((c == 'd' || c == 'i' || c == 'u' || c == 'o' || c == 'x'
|| c == 'X' || c == 'p'))
ft_print_i_pad(c, b, prm, arg);
else if (c == 'f' && (prm->p >> 9 & 1))
ft_print_long_db_pad(b, prm, &ldb);
else if (c == 'f')
ft_print_db_pad(b, prm, &db);
else if (c == 'B')
ft_print_bit_float(b, prm, valist);
}
static void ft_read_input(va_list valist, char *buf,
t_param *prm, const char *format)
{
while (*format)
{
ft_init_param(prm);
ft_printbuf_c(buf, &format, '%');
if (!*format)
break ;
if (*format == '%' && ft_parse(&format, prm))
ft_print(*format, buf, prm, valist);
else if (*format)
{
ft_print_c_pad('c', buf, prm, *format);
format++;
if (*format)
ft_printbuf_c(buf, &format, '%');
}
if (*format && (*format != '%' || *(format - 1) == '%'))
format++;
}
}
int ft_printf(const char *format, ...)
{
va_list valist;
t_param prm;
char buf[BUF_SIZE];
g_bcn = 0;
if (format == 0 || *format == '\0')
return (0);
va_start(valist, format);
ft_read_input(valist, buf, &prm, format);
va_end(valist);
write(1, buf, g_bcn);
return (g_bcn);
}