/
print_nbr.c
104 lines (94 loc) · 2.64 KB
/
print_nbr.c
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* print_nbr.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: daelee <daelee@student.42seoul.kr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/09/04 18:07:52 by daelee #+# #+# */
/* Updated: 2020/09/16 11:56:29 by daelee ### ########.fr */
/* */
/* ************************************************************************** */
#include "ft_printf.h"
int put_pointer_prefix(char **buf)
{
*buf = ft_strjoin("0x", *buf, 2);
return (ft_strlen(*buf));
}
int put_minus(t_info *info, char **buf)
{
int len_to_add;
len_to_add = 0;
if ((info->type == 'i' || info->type == 'd') &&
info->zero == 0 && info->nbr_sign == -1)
{
*buf = ft_strjoin("-", *buf, 2);
len_to_add = 1;
}
return (len_to_add);
}
int put_minus2(int buf_len, t_info *info, char **buf)
{
int len_to_add;
len_to_add = 0;
if (info->nbr_sign == -1 && info->zero == 1)
{
if (buf_len >= info->width)
{
*buf = ft_strjoin("-", *buf, 2);
len_to_add = 1;
}
else if (buf_len < info->width)
*buf[0] = '-';
}
return (len_to_add);
}
int put_prec_str(unsigned long long nbr, t_info *info, char **buf)
{
int buf_len;
int ret;
int i;
buf_len = ft_nbrlen(nbr, info);
ret = (info->prec > buf_len) ? info->prec : buf_len;
if (!(*buf = (char *)malloc(sizeof(char) * ret + 1)))
return (0);
i = 0;
(*buf)[ret] = '\0';
while (buf_len + i < ret)
{
(*buf)[i] = '0';
i++;
}
i = 1;
if (nbr == 0 && info->prec != 0)
(*buf)[ret - i] = '0';
while (nbr)
{
(*buf)[ret - i] = ft_baseset(info->type)[nbr % info->nbr_base];
nbr /= info->nbr_base;
i++;
}
return (buf_len);
}
int print_nbr(unsigned long long nbr, t_info *info)
{
char *buf;
int buf_len;
int ret;
if (info->type == 'x' || info->type == 'X' || info->type == 'p')
info->nbr_base = 16;
if ((info->type == 'd' || info->type == 'i') && (int)nbr < 0)
{
info->nbr_sign = -1;
nbr = -nbr;
}
buf_len = put_prec_str(nbr, info, &buf);
buf_len += put_minus(info, &buf);
if (info->type == 'p')
buf_len = put_pointer_prefix(&buf);
ret = put_width_str(&buf, info);
ret += put_minus2(buf_len, info, &buf);
ft_putstr(buf);
free(buf);
return (ret);
}