/ libft / src / ft_printf / ft_printf.c
ft_printf.c
 1  /* ************************************************************************** */
 2  /*                                                                            */
 3  /*                                                        :::      ::::::::   */
 4  /*   ft_printf.c                                        :+:      :+:    :+:   */
 5  /*                                                    +:+ +:+         +:+     */
 6  /*   By: ll-hotel <ll-hotel@student.42lyon.fr>      +#+  +:+       +#+        */
 7  /*                                                +#+#+#+#+#+   +#+           */
 8  /*   Created: 2023/11/14 15:39:41 by ll-hotel          #+#    #+#             */
 9  /*   Updated: 2024/08/20 17:50:08 by ll-hotel         ###   ########.fr       */
10  /*                                                                            */
11  /* ************************************************************************** */
12  
13  #include "ft_printf.h"
14  #include "ft_basics.h"
15  #include <stdarg.h>
16  #include <unistd.h>
17  
18  int	handle_format(const char *f, va_list *args, int *count);
19  int	handle_string(const char f, va_list *args);
20  int	handle_number(const char f, va_list *args);
21  int	handle_special(const char f, va_list *args);
22  
23  static int	to_next_symbol(const char *f)
24  {
25  	int	i;
26  
27  	if (!f)
28  		return (0);
29  	i = 0;
30  	while (f[i] && f[i] != '%')
31  		i += 1;
32  	return (write(1, f, i));
33  }
34  
35  int	ft_printf(const char *format, ...)
36  {
37  	const unsigned long	len = ft_strlen(format);
38  	va_list				args;
39  	unsigned long		l;
40  	int					count;
41  	int					tmp;
42  
43  	va_start(args, format);
44  	l = 0;
45  	count = 0;
46  	tmp = 0;
47  	while (l < len)
48  	{
49  		tmp = to_next_symbol(format + l);
50  		l += tmp + 1;
51  		count += tmp;
52  		if (!format[l - 1])
53  			continue ;
54  		tmp = handle_format(format + l, &args, &count);
55  		if (tmp < 0)
56  			return (va_end(args), -1);
57  		l += tmp;
58  	}
59  	va_end(args);
60  	return (count);
61  }