-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathutils.c
115 lines (104 loc) · 3.38 KB
/
utils.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
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* utils.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: nsierra- <[email protected]> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2021/11/29 20:22:23 by nsierra- #+# #+# */
/* Updated: 2021/11/30 16:57:21 by nsierra- ### ########.fr */
/* */
/* ************************************************************************** */
#include "ft_printf.h"
#include "libft.h"
#include <stdlib.h>
void cat_padding(t_printf *state, char *str, int padding_size)
{
char padding_character;
if (state->op.zero_padded == TRUE
&& state->op.justified_left == FALSE)
padding_character = '0';
else
padding_character = ' ';
while (*str)
str++;
while (padding_size-- > 0)
*str++ = padding_character;
}
char *apply_length_flag(t_printf *state, char *original)
{
size_t original_size;
char *flagged;
int padding_size;
int i;
original_size = ft_strlen(original);
if (state->op.length == FALSE || state->op.length_value <= original_size)
return (original);
i = 0;
padding_size = state->op.length_value - original_size;
flagged = ft_calloc(state->op.length_value + 1, sizeof(char));
if (flagged == NULL)
return (original);
if ((*original == '+' || *original == '-') && state->op.zero_padded)
flagged[i++] = *original;
if (state->op.justified_left == TRUE)
ft_strlcat(flagged, original + i, state->op.length_value + 1);
cat_padding(state, flagged, padding_size);
if (state->op.justified_left == FALSE)
ft_strlcat(flagged, original + i, state->op.length_value + 1);
free(original);
return (flagged);
}
char *apply_precison_flag(t_printf *state, int raw, char *original)
{
char *fl;
char *original_save;
size_t n_size;
size_t fl_size;
if (state->op.precision == FALSE)
return (original);
original_save = original;
if (raw < 0)
++original;
n_size = ft_strlen(original);
if (n_size >= state->op.precision_value)
return (original_save);
fl_size = (state->op.precision_value - n_size) + n_size;
if (raw < 0)
++fl_size;
fl = ft_calloc(fl_size + 1, sizeof(char));
if (fl == NULL)
return (original);
else if (raw < 0)
ft_strlcat(fl, "-", fl_size + 1);
ft_fill_str(ft_strchr(fl, '\0'), '0', (state->op.precision_value - n_size));
ft_strlcat(fl, original, fl_size + 1);
free(original_save);
return (fl);
}
char *apply_sharp_flag(t_printf *state, char *original, char *prefix)
{
char *flagged;
if (state->op.alternative == FALSE
|| ft_strncmp(original, "0", ft_strlen(original)) == 0)
return (original);
flagged = ft_strjoin(prefix, original);
if (flagged == NULL)
return (original);
free(original);
return (flagged);
}
char *apply_special_cases(t_printf *state, int raw, char *original)
{
char *flagged;
if (state->op.precision == TRUE
&& state->op.precision_value == 0 && raw == 0)
{
flagged = ft_calloc(1, sizeof(char));
if (flagged == NULL)
return (original);
free(original);
return (flagged);
}
return (original);
}