summaryrefslogtreecommitdiff
path: root/src/ft_printf.c
blob: b107513d8ab3f3539fa91161e6f4071a7f0b1c7f (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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/* ************************************************************************** */
/*                                                                            */
/*                                                        :::      ::::::::   */
/*   ft_printf.c                                        :+:      :+:    :+:   */
/*                                                    +:+ +:+         +:+     */
/*   By: dkaiser <dkaiser@student.42heilbronn.de    +#+  +:+       +#+        */
/*                                                +#+#+#+#+#+   +#+           */
/*   Created: 2024/03/12 18:18:59 by dkaiser           #+#    #+#             */
/*   Updated: 2024/03/15 13:05:57 by dkaiser          ###   ########.fr       */
/*                                                                            */
/* ************************************************************************** */

#include "../ft_printf.h"

static int	print_char(char c)
{
	return (write(1, &c, 1));
}

static int	print_str(char *str)
{
	int	success;
	int	len;

	if (str)
	{
		len = 0;
		while (str[len])
			len++;
		success = write(1, str, len);
		if (success < 0)
			return (-1);
		return (len);
	}
	else
	{
		success = write(1, "(null)", 6);
		if (success == 6)
			return (6);
		return (-1);
	}
}

static int	print_conv(va_list args, char c)
{
	if (c == 'c')
		return (print_char(va_arg(args, int)));
	if (c == 's')
		return (print_str(va_arg(args, char *)));
	if (c == 'p')
		return (ft_printaddr(va_arg(args, void *)));
	if (c == 'd' || c == 'i')
		return (ft_printnbr(va_arg(args, int)));
	if (c == 'u')
		return (ft_printunbr(va_arg(args, unsigned int)));
	if (c == 'x' || c == 'X')
		return (ft_printhex(va_arg(args, unsigned int), c));
	if (c == '%')
		return (print_char('%'));
	return (-1);
}

int	ft_printf(const char *fmt, ...)
{
	int		result;
	int		last_result;
	int		success;
	va_list	args;

	result = 0;
	va_start(args, fmt);
	while (*fmt)
	{
		last_result = result;
		if (*fmt == '%')
			result += print_conv(args, *(++fmt));
		else
		{
			success = write(1, fmt, 1);
			if (success <= 0)
				return (-1);
			result++;
		}
		fmt++;
		if (result < last_result)
			return (-1);
	}
	va_end(args);
	return (result);
}