-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathprint_int.c
80 lines (73 loc) · 2.46 KB
/
print_int.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
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* print_int.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: jjacobso <[email protected]> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2019/01/23 18:48:19 by jjacobso #+# #+# */
/* Updated: 2019/01/27 19:07:25 by jjacobso ### ########.fr */
/* */
/* ************************************************************************** */
#include "printf.h"
int print_sign(char *sign)
{
if (sign)
ft_putstr(sign);
return (1);
}
void ptr_body_print(t_spec *spec, int ptrlen, char *s)
{
ft_putstr("0x");
if (spec->prec != -1 && ptrlen < spec->prec)
ft_putnchar('0', spec->prec - ptrlen);
ft_putnstr(s, ptrlen);
}
int print_pointer(va_list *ap, t_spec *spec)
{
char *s;
size_t ptr;
int len;
int ptrlen;
while (spec->narg-- > 1)
(void)va_arg(*ap, int);
ptr = va_arg(*ap, size_t);
s = ft_itoabase(ptr, 16);
ptrlen = (ptr == 0 && spec->prec == 0) ? 0 : ft_strlen(s);
if (check_flag(spec->flags, ZERO) && ptrlen < spec->width)
spec->prec = ft_max(spec->width - 2, spec->prec);
len = ft_max(ptrlen, spec->prec) + 2;
if (check_flag(spec->flags, MINUS))
{
ptr_body_print(spec, ptrlen, s);
padding(&len, spec, ' ');
}
else
{
padding(&len, spec, ' ');
ptr_body_print(spec, ptrlen, s);
}
ft_memdel((void **)&s);
return (len);
}
int print_number(va_list *ap, t_spec *spec)
{
char *n;
int len;
char *sign;
sign = NULL;
while (spec->narg-- > 1)
(void)va_arg(*ap, int);
ft_strchr("fFeEgG", spec->type) ? (n = getdouble(ap, spec, &sign)) :
(n = getnum(ap, spec, &sign));
EXITIF(!n);
len = ft_strlen(n) + ft_strlen(sign);
if (check_flag(spec->flags, MINUS))
(void)(print_sign(sign) + ft_putstr(n) + padding(&len, spec, ' '));
else if (check_flag(spec->flags, ZERO) && spec->prec == -1)
(void)(print_sign(sign) + padding(&len, spec, '0') + ft_putstr(n));
else
(void)(padding(&len, spec, ' ') + print_sign(sign) + ft_putstr(n));
ft_nfree(2, &sign, &n);
return (len);
}