int check_p(char c, t_args **arg, va_list ap) { int len; unsigned long val; int prec; len = 0; if (c == 'p') { val = (unsigned long)va_arg(ap, void*); prec = ((*arg)->precision >= 0) ? (*arg)->precision : (*arg)->field - \ ft_nbrlen_base(val, 16, -1) - 2 + (val == 0); len += ft_putnchar(' ', (!(*arg)->justify && !(*arg)->zero) ? \ (*arg)->field - ft_nbrlen_base(val, 16, -1) - 2 : 0); len += ft_putstr("0x"); len += ft_putnbr_base(val, 16, ((*arg)->zero || \ (*arg)->precision >= 0) ? prec : -1, 0); len += ft_putnchar(' ', ((*arg)->justify) ? (*arg)->field -\ ft_nbrlen_base(val, 16, -1) - 2 : 0); }
int ft_putunbr_base(unsigned long long n, int base, int prec, int maj) { const char basestr[17] = "0123456789abcdef"; const char basestrmaj[17] = "0123456789ABCDEF"; int wr; wr = 0; if (n == 0 && prec == 0) return (0); if (prec > 0) { wr += ft_putnchar('0', prec - ft_nbrlen_base(n, base, 0)); } if ((n / base) > 0) wr += ft_putunbr_base(n / base, base, 0, maj); ft_putchar((maj) ? basestrmaj[(n % base)] : basestr[(n % base)]); return (++wr); }
/* */ /* ************************************************************************** */ #include "libft.h" #include "utils.h" int ft_print_unsigned(va_list *list_args, t_args *arg) { unsigned long nb; int ret; if (arg->type == 'U') nb = va_arg(*list_args, unsigned long); else nb = ft_cast_unsigned(list_args, arg); ret = ft_nbrlen_base(nb, 10); if (nb == 0 && arg->precis == 0 && arg->val_prec == 1) ret = 0; (arg->precis < ret) ? arg->precis = ret : 0; (arg->field < arg->precis) ? arg->field = arg->precis : 0; if (!arg->val_minus && arg->val_field && (arg->val_prec || !arg->val_z)) ft_printnchar(arg->field - arg->precis, ' '); if (!arg->val_minus && arg->val_z && arg->val_prec == 0) ft_printnchar(arg->field - arg->precis, '0'); ft_printnchar(arg->precis - ret, '0'); if (ret != 0) ft_putbase(nb, 10, arg->type); (arg->val_minus == 1) ? ft_printnchar(arg->field - arg->precis, ' ') : 0; return (ft_retfield(arg, ret)); }