-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathft_printf_utils_parsing.c
115 lines (107 loc) · 3.6 KB
/
ft_printf_utils_parsing.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
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* ft_printf_utils_parsing.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: gmarra <gmarra@student.42firenze.it> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/12/18 15:22:05 by gmarra #+# #+# */
/* Updated: 2024/12/22 16:33:38 by gmarra ### ########.fr */
/* */
/* ************************************************************************** */
#include "ft_printf.h"
static void calc_bitmask(unsigned int *flgmask, int format_type)
{
if (format_type == TYPE_C)
*flgmask = *flgmask & CHR;
else if (format_type == TYPE_S)
*flgmask = *flgmask & STR;
else if (format_type == TYPE_P)
*flgmask = *flgmask & PTR;
else if (format_type == TYPE_D)
*flgmask = *flgmask & DEC;
else if (format_type == TYPE_I)
*flgmask = *flgmask & INT;
else if (format_type == TYPE_U)
*flgmask = *flgmask & UINT;
else if (format_type == TYPE_X || format_type == TYPE_XX)
*flgmask = *flgmask & HEX;
}
static void format_precision(t_placeholder *data)
{
ssize_t act_dim;
ssize_t char2add;
act_dim = ftpf_strlen(data->str);
char2add = data->precision - act_dim;
if (char2add <= 0 && data->format_type == TYPE_S)
data->str = ft_strshrink(data->str, act_dim, data->precision);
else if (char2add > 0 && data->format_type > TYPE_S)
while (char2add--)
data->str = ft_stradd("0", data->str, 0);
}
static void format_width(t_placeholder *data)
{
ssize_t act_dim;
ssize_t char2add;
if (data->format_type == TYPE_C && !data->str[0])
set_bit(&data->flgmask, IS_ZERO);
act_dim = ftpf_strlen(data->str) + get_bit(data->flgmask, IS_ZERO);
char2add = data->width - act_dim;
if (get_bit(data->flgmask, MINUS))
{
while (char2add--)
data->str = ft_stradd(" ", data->str, 1);
}
else
{
while (char2add--)
{
if (get_bit(data->flgmask, ZERO))
data->str = ft_stradd("0", data->str, 0);
else
data->str = ft_stradd(" ", data->str, 0);
}
}
check_sign_zero(data);
}
static void evaluate_flags(t_placeholder *data)
{
if (get_bit(data->flgmask, DOT))
format_precision(data);
if (data->str[0] == '0' && get_bit(data->flgmask, DOT)
&& !data->precision && !get_bit(data->flgmask, HASHTAG))
{
free(data->str);
data->str = ftpf_strdup("");
}
if (get_bit(data->flgmask, IS_NEG))
data->str = ft_stradd("-", data->str, 0);
else if (get_bit(data->flgmask, PLUS))
data->str = ft_stradd("+", data->str, 0);
else if (get_bit(data->flgmask, SPACE))
data->str = ft_stradd(" ", data->str, 0);
if ((get_bit(data->flgmask, HASHTAG) && data->str[0] != '0')
|| data->format_type == TYPE_P)
data->str = ft_stradd("0x", data->str, 0);
if (get_bit(data->flgmask, WIDTH)
&& (int)ftpf_strlen(data->str) < data->width)
format_width(data);
if (data->format_type == TYPE_XX)
ftpf_toupper_str(data->str);
}
void format_str(t_placeholder *data2process)
{
if (data2process->str == NULL)
{
data2process->str = ftpf_strdup("(null)");
return ;
}
else if (data2process->format_type == TYPE_P && data2process->str[0] == '0')
{
free (data2process->str);
data2process->str = ftpf_strdup("(nil)");
return ;
}
calc_bitmask(&data2process->flgmask, data2process->format_type);
evaluate_flags(data2process);
}