/ ft_printf / ft_printf / print_address.c
print_address.c
 1  /* ************************************************************************** */
 2  /*                                                                            */
 3  /*                                                        :::      ::::::::   */
 4  /*   print_address.c                                    :+:      :+:    :+:   */
 5  /*                                                    +:+ +:+         +:+     */
 6  /*   By: gychoi <gychoi@student.42seoul.kr>         +#+  +:+       +#+        */
 7  /*                                                +#+#+#+#+#+   +#+           */
 8  /*   Created: 2022/09/09 21:42:55 by gychoi            #+#    #+#             */
 9  /*   Updated: 2022/09/13 14:25:56 by gychoi           ###   ########.fr       */
10  /*                                                                            */
11  /* ************************************************************************** */
12  
13  #include "ft_printf.h"
14  
15  int	print_address_recursive(unsigned long long num, char *base)
16  {
17  	int	printed;
18  	int	ret;
19  
20  	printed = 0;
21  	if (num >= 16)
22  		printed += print_address_recursive(num / 16, base);
23  	ret = (int)write(1, &base[num % 16], 1);
24  	if (ret < 0)
25  		return (-1);
26  	printed += ret;
27  	return (printed);
28  }
29  
30  int	print_address(void *p)
31  {
32  	unsigned long long	daddr;
33  	int					printed;
34  	int					ret;
35  
36  	if (p == 0)
37  	{
38  		ret = (int)write(1, "0x0", 3);
39  		if (ret < 0)
40  			return (-1);
41  		return (ret);
42  	}
43  	printed = 0;
44  	daddr = (unsigned long long)p;
45  	ret = (int)write(1, "0x", 2);
46  	if (ret < 0)
47  		return (-1);
48  	printed += ret;
49  	ret = print_address_recursive(daddr, "0123456789abcdef");
50  	if (ret < 0)
51  		return (-1);
52  	printed += ret;
53  	return (printed);
54  }