summaryrefslogtreecommitdiff
path: root/libft/ft_vdprintf.c
blob: 3d6b5dae768166f9adbfa0d39150e893c6933eec (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/* ************************************************************************** */
/*                                                                            */
/*                                                        :::      ::::::::   */
/*   ft_vdprintf.c                                      :+:      :+:    :+:   */
/*                                                    +:+ +:+         +:+     */
/*   By: kdx    <kdx   @student.42angouleme.fr      +#+  +:+       +#+        */
/*                                                +#+#+#+#+#+   +#+           */
/*   Created: 2022/09/30 05:04:45 by kdx               #+#    #+#             */
/*   Updated: 2022/10/14 02:26:57 by kdx              ###   ########.fr       */
/*                                                                            */
/* ************************************************************************** */

#include "libft.h"
#include <unistd.h>

static t_i32	put_ptr(void *ptr, int fd)
{
	t_i32	rv;

	rv = 0;
	if (ptr != NULL)
	{
		rv += ft_putstr_fd("0x", fd);
		rv += ft_putu128x_fd((t_u64)ptr, fd, 0);
	}
	else
		rv += ft_putstr_fd("(nil)", fd);
	return (rv);
}

static t_i32	put_element(t_i32 fd, const char *fmt, va_list va)
{
	if (*fmt == '%')
		return (ft_putchar_fd(*fmt, fd));
	if (*fmt == 'c')
		return (ft_putchar_fd(va_arg(va, int), fd));
	if (*fmt == 'd' || *fmt == 'i')
		return (ft_puti128_fd(va_arg(va, int), fd));
	if (*fmt == 'u')
		return (ft_puti128_fd(va_arg(va, unsigned int), fd));
	if (*fmt == 'p')
		return (put_ptr(va_arg(va, void *), fd));
	if (*fmt == 'x' || *fmt == 'X')
		return (ft_putu128x_fd(va_arg(va, unsigned int), fd, *fmt == 'X'));
	if (*fmt == 's')
		return (ft_putstr_fd(va_arg(va, char *), fd));
	return (0);
}

t_i32	ft_vdprintf(t_i32 fd, const char *fmt, va_list va)
{
	t_i32			rv;

	rv = 0;
	while (*fmt != '\0')
	{
		if (*fmt == '%' && ft_strchr("cdiupxXs%", fmt[1]) != NULL)
		{
			fmt += 1;
			rv += put_element(fd, fmt, va);
		}
		else
			rv += ft_putchar_fd(*fmt, fd);
		fmt += 1;
	}
	return (rv);
}