-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathspecifier_u.c
70 lines (65 loc) · 2.28 KB
/
specifier_u.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
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* specifier_u.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: jfreitas <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/01/11 15:41:39 by jfreitas #+# #+# */
/* Updated: 2020/02/24 15:14:11 by jfreitas ### ########.fr */
/* */
/* ************************************************************************** */
#include "ft_printf.h"
static void print_u(t_var *var, int n, int n_len)
{
int n_negative;
n_negative = (n < 0) ? 1 : 0;
n *= (n < 0) ? -1 : 1;
if (var->period_fw > n_len)
space_or_zero('0', var->period_fw - n_len);
if (n_negative)
ft_putnbr_unsigned(4294967296 - n);
else if (n == 0)
{
if (var->period_fw == 0 && var->min_fw > 0)
ft_putchar(' ');
else if (var->period_fw == 0 && !var->min_fw)
{
var->len_format -= 1;
ft_putstr("\0");
}
else if (var->period_fw == -1 && !var->min_fw && !*var->each_flag)
ft_putnbr(n);
else
ft_putnbr(n);
}
else if (n > 0 && n <= 4294967295u)
ft_putnbr_unsigned(n);
}
t_var *specifier_u(t_var *var)
{
unsigned int n;
int n_len;
int new_len;
n = (unsigned int)va_arg(var->ap, int);
n_len = ft_intlen_base(n, 10);
new_len = n_len;
if (var->each_flag[1] == '0' && !var->each_flag[0] && var->period_fw == -1
&& var->min_fw > 0)
{
var->period_fw = var->min_fw;
if (n < 0 || var->each_flag[0])
var->period_fw--;
}
if (var->period_fw >= 0 && n_len <= var->period_fw)
new_len = var->period_fw;
if (n < 0)
new_len++;
var->len_format += (new_len < var->min_fw) ? var->min_fw : new_len;
if (var->each_flag[0] != '-' && var->min_fw > 0 && var->min_fw > n_len)
space_or_zero(' ', var->min_fw - new_len);
print_u(var, n, n_len);
if (var->each_flag[0] == '-' && var->min_fw > n_len)
space_or_zero(' ', var->min_fw - new_len);
return (var);
}