diff options
Diffstat (limited to '')
-rw-r--r-- | libft/src/ft_printf_put_int.c | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/libft/src/ft_printf_put_int.c b/libft/src/ft_printf_put_int.c new file mode 100644 index 0000000..ddf06b7 --- /dev/null +++ b/libft/src/ft_printf_put_int.c @@ -0,0 +1,115 @@ +/* ************************************************************************** */ +/* LE - / */ +/* / */ +/* ft_printf_put_int.c .:: .:/ . .:: */ +/* +:+:+ +: +: +:+:+ */ +/* By: rbousset <marvin@le-101.fr> +:+ +: +: +:+ */ +/* #+# #+ #+ #+# */ +/* Created: 2019/12/31 14:40:45 by rbousset #+# ## ## #+# */ +/* Updated: 2019/12/31 14:40:45 by rbousset ### #+. /#+ ###.fr */ +/* / */ +/* / */ +/* ************************************************************************** */ + +#include <libft.h> +#include <stddef.h> +#include <stdlib.h> +#include <stdarg.h> +#include <inttypes.h> + +static long + ft_printf_get_dlh(va_list arg, int8_t lh) +{ + if (lh == 0) + return (va_arg(arg, int)); + else if (lh == -2) + return ((char)va_arg(arg, int)); + else if (lh == -1) + return ((short)va_arg(arg, int)); + else if (lh == 1) + return (va_arg(arg, long int)); + else if (lh == 2) + return (va_arg(arg, long int)); + return (va_arg(arg, int)); +} + +static unsigned long + ft_printf_get_ulh(va_list arg, int8_t lh, uint8_t zflag) +{ + if (zflag == 1) + return (va_arg(arg, size_t)); + else if (lh == 0) + return (va_arg(arg, unsigned int)); + else if (lh == -2) + return ((unsigned char)va_arg(arg, unsigned int)); + else if (lh == -1) + return ((unsigned short)va_arg(arg, unsigned int)); + else if (lh == 1) + return (va_arg(arg, unsigned long int)); + else if (lh == 2) + return (va_arg(arg, unsigned long int)); + return (va_arg(arg, unsigned int)); +} + +static long + ft_printf_put_plus_minus(long d, t_printflist *pflist) +{ + if (pflist->precision >= pflist->putlen && pflist->isneg == 1) + { + ft_printf_cat_output("-", 1, pflist); + pflist->putlen -= 1; + d = -d; + } + else if (pflist->isaplus && !pflist->isneg) + ft_printf_cat_output("+", 1, pflist); + return (d); +} + +void + ft_printf_put_d(va_list arg, t_printflist *pflist) +{ + long d; + char *str; + + d = ft_printf_get_dlh(arg, pflist->lh); + (d < 0) ? (pflist->isneg = 1) + : (pflist->isneg = 0); + pflist->conv = 'd'; + pflist->putlen += ft_intlen(d); + if (pflist->isaplus && !pflist->isneg) + pflist->putlen += 1; + (d == 0 && pflist->precision == -1 && pflist->width > 0) + ? (pflist->putlen = 0) : 0; + ft_printf_put_width_pre(pflist); + d = ft_printf_put_plus_minus(d, pflist); + ft_printf_put_precision(pflist); + if (!(pflist->precision < 0 && d == 0)) + { + str = ft_itoa(d); + ft_printf_cat_output(str, ft_strlen(str), pflist); + ft_memdel(str); + } + ft_printf_put_width_post(pflist); +} + +void + ft_printf_put_u(va_list arg, t_printflist *pflist) +{ + unsigned long d; + char *str; + + d = ft_printf_get_ulh(arg, pflist->lh, pflist->zflag); + pflist->conv = 'd'; + pflist->putlen += ft_uintlen(d); + (d == 0 && pflist->precision == -1 && pflist->width > 0) + ? (pflist->putlen = 0) : 0; + ft_printf_put_width_pre(pflist); + ft_printf_put_precision(pflist); + if (!(pflist->precision < 0 && d == 0)) + { + str = ft_uitoa(d); + ft_printf_cat_output(str, ft_strlen(str), pflist); + ft_memdel(str); + } + ft_printf_put_width_post(pflist); +} |