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 }