-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathprintf_justify.c
122 lines (108 loc) · 2.57 KB
/
printf_justify.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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include "./printf.h"
char *justify_char(t_print *p, char c)
{
int padding;
char *ret;
padding = p->width - 1;
padding = padding > 0 ? padding : 0;
ret = ft_strnew(padding + 1);
ft_memset(ret, ' ', padding + 1);
if (p->f_left)
ft_memcpy(ret, &c, 1);
else
ft_memcpy(ret + padding, &c, 1);
return (ret);
}
void justify_uint(t_print *p, char *digits)
{
int padding;
int len;
char *ret;
len = ft_strlen(digits);
padding = p->width - len;
padding = padding > 0 ? padding : 0;
ret = ft_strnew(padding + len);
ft_memset(ret, p->f_pad, padding + len);
if (p->f_left)
ft_memcpy(ret, digits, len);
else
ft_memcpy(ret + padding, digits, len);
p->r = ft_strwfjoin(p, ret, len + padding);
ft_strdel(&ret);
}
void justify_dec(t_print *p, char *digits)
{
int padding;
int len;
char *ret;
len = ft_strlen(digits);
padding = p->width - len;
padding = padding > 0 ? padding : !!p->f_sign;
ret = ft_strnew(padding + len);
ft_memset(ret, p->f_pad, padding + len);
if (p->f_sign)
*ret = p->f_sign;
if (p->f_left)
ft_memcpy(p->f_sign ? ret + 1 : ret, digits, len);
else
{
ft_memcpy(ret + padding, digits, len);
if (p->f_pad == ' ')
ft_strrev(ret, padding);
}
p->r = ft_strwfjoin(p, ret, len + padding);
ft_strdel(&ret);
}
char *justify_string(t_print *p, char *str)
{
int padding;
int len;
char *ret;
len = ft_strlen(str);
len = len < p->precision || p->precision < 0 ? len : p->precision;
padding = p->width - (len);
padding = padding > 0 ? padding : 0;
ret = ft_strnew(padding + len);
ft_memset(ret, ' ', padding + len);
if (p->f_left)
ft_memcpy(ret, str, len);
else
ft_memcpy(ret + padding, str, len);
return (ret);
}
void justify_oct(t_print *p, char *digits)
{
int padding;
int len;
char *ret;
len = ft_strlen(digits);
padding = p->width - len;
padding = padding > 0 ? padding : 0;
ret = ft_strnew(padding + len);
ft_memset(ret, p->f_pad, padding + len);
if (p->f_left)
ft_memcpy(ret, digits, len);
else
ft_memcpy(ret + padding, digits, len);
p->r = ft_strwfjoin(p, ret, len + padding);
ft_strdel(&ret);
}
void justify_hex(t_print *p, char *digits, size_t capital)
{
int padding;
int len;
char *ret;
len = ft_strlen(digits);
padding = p->width - len;
padding = padding > 0 ? padding : 0;
ret = ft_strnew(padding + len);
ft_memset(ret, p->f_pad, padding + len);
if (p->f_left)
ft_memcpy(ret, digits, len);
else
ft_memcpy(ret + padding, digits, len);
if (p->f_alt)
ft_memcpy(ret + (p->f_left || p->f_pad == '0' ? 0 : padding) + 1, capital ? "X" : "x", 1);
p->r = ft_strwfjoin(p, ret, len + padding);
ft_strdel(&ret);
}