/ libft / src / ft_printf / ft_printf_handlers.c
ft_printf_handlers.c
 1  /* ************************************************************************** */
 2  /*                                                                            */
 3  /*                                                        :::      ::::::::   */
 4  /*   ft_printf_handlers.c                               :+:      :+:    :+:   */
 5  /*                                                    +:+ +:+         +:+     */
 6  /*   By: ll-hotel <ll-hotel@student.42.fr>          +#+  +:+       +#+        */
 7  /*                                                +#+#+#+#+#+   +#+           */
 8  /*   Created: 2023/11/27 03:56:34 by ll-hotel          #+#    #+#             */
 9  /*   Updated: 2024/08/20 17:50:28 by ll-hotel         ###   ########.fr       */
10  /*                                                                            */
11  /* ************************************************************************** */
12  
13  #include "ft_basics.h"
14  #include "ft_math.h"
15  #include <stdarg.h>
16  #include <stdlib.h>
17  
18  int	handle_string(const char f, va_list *args)
19  {
20  	char	*s;
21  
22  	if (f == '%')
23  		return (ft_putchar_fd('%', 1), 1);
24  	else if (f == 'c')
25  		return (ft_putchar_fd(va_arg(*args, int), 1), 1);
26  	else if (f == 's')
27  	{
28  		s = va_arg(*args, char *);
29  		if (!s)
30  			s = "(null)";
31  		return (ft_putstr_fd(s, 1), ft_strlen(s));
32  	}
33  	return (0);
34  }
35  
36  int	handle_number(const char f, va_list *args)
37  {
38  	int		i;
39  
40  	i = 0;
41  	if (f == 'i' || f == 'd')
42  		i = va_arg(*args, int);
43  	else
44  		return (0);
45  	return (ft_putnbr_fd(i, 1), ft_log_b(i, 10) + 1 + (i < 0));
46  }
47  
48  int	handle_special(const char f, va_list *args)
49  {
50  	char	*s;
51  	int		len;
52  
53  	s = 0;
54  	if (f == 'p')
55  		s = ft_xtoa(va_arg(*args, unsigned long), 1, 0);
56  	else if (f == 'X' || f == 'x')
57  		s = ft_xtoa(va_arg(*args, unsigned int), 0, f == 'X');
58  	else if (f == 'u')
59  		s = ft_utoa(va_arg(*args, unsigned int));
60  	len = 0;
61  	if (s)
62  	{
63  		if (f == 'p' && !ft_strncmp(s, "0x0", 3))
64  			s = (free(s), "(nil)");
65  		len = (ft_putstr_fd(s, 1), ft_strlen(s));
66  		if (ft_strncmp(s, "(nil)", 3))
67  			free(s);
68  	}
69  	return (len);
70  }
71  
72  int	handle_format(const char *f, va_list *args, int *count)
73  {
74  	int	err;
75  
76  	if (!*f)
77  		return (0);
78  	err = 0;
79  	if (*f == '%' || *f == 'c' || *f == 's')
80  		err = handle_string(*f, args);
81  	else if (*f == 'i' || *f == 'd')
82  		err = handle_number(*f, args);
83  	else if (*f == 'p' || *f == 'u' || *f == 'x' || *f == 'X')
84  		err = handle_special(*f, args);
85  	if (err > 0)
86  		*count += err;
87  	return ((err >= 0) - (err < 0));
88  }