/ libft / src / ft_dprintf / src / dprintf.c
dprintf.c
 1  /* ************************************************************************** */
 2  /*                                                                            */
 3  /*                                                        :::      ::::::::   */
 4  /*   dprintf.c                                          :+:      :+:    :+:   */
 5  /*                                                    +:+ +:+         +:+     */
 6  /*   By: ll-hotel <ll-hotel@student.42lyon.fr>      +#+  +:+       +#+        */
 7  /*                                                +#+#+#+#+#+   +#+           */
 8  /*   Created: 2024/02/06 19:13:27 by ll-hotel          #+#    #+#             */
 9  /*   Updated: 2024/04/24 16:21:01 by ll-hotel         ###   ########.fr       */
10  /*                                                                            */
11  /* ************************************************************************** */
12  
13  #include "ft_dprintf.h"
14  #include "dprintf_inner.h"
15  
16  static void	_init_buf(int must_init, \
17  		char string[FD_NUMBER][DPRINTF_BUFFERSIZE], \
18  		int length[FD_NUMBER]);
19  
20  int	ft_dprintf(int fd, const char *format, ...)
21  {
22  	static t_buffer	buffer = {.fd = -1};
23  	va_list			vargs;
24  	int32_t			i;
25  	int32_t			tmp;
26  	int32_t			ret_val;
27  
28  	if (!format || fd < 0 || write(1, 0, 0) == -1)
29  		return (-1);
30  	_init_buf(buffer.fd == -1, buffer.string, buffer.length);
31  	va_start(vargs, format);
32  	buffer.fd = fd;
33  	ret_val = 0;
34  	i = 0;
35  	while (format[i])
36  	{
37  		tmp = ft_buffer_cat_perc(&buffer, fd, format + i);
38  		ret_val = ret_val * (tmp >= 0) + tmp * (ret_val > -1);
39  		i += tmp;
40  		if (format[i] != '%')
41  			continue ;
42  		tmp = ft_specifier(format + i + 1, vargs, &buffer);
43  		ret_val = ret_val * (tmp >= 0) + tmp * (ret_val > -1);
44  		i += 2;
45  	}
46  	return (va_end(vargs), ret_val);
47  }
48  
49  static void	_init_buf(int must_init, \
50  		char string[FD_NUMBER][DPRINTF_BUFFERSIZE], \
51  		int length[FD_NUMBER])
52  {
53  	if (!must_init)
54  		return ;
55  	ft_bzero((char *)string, FD_NUMBER * DPRINTF_BUFFERSIZE);
56  	ft_bzero((char *)length, FD_NUMBER * sizeof(*length));
57  }