94 lines
2.9 KiB
C
94 lines
2.9 KiB
C
/* ************************************************************************** */
|
|
/* */
|
|
/* ::: :::::::: */
|
|
/* utils2.c :+: :+: :+: */
|
|
/* +:+ +:+ +:+ */
|
|
/* By: maiboyer <maiboyer@student.42.fr> +#+ +:+ +#+ */
|
|
/* +#+#+#+#+#+ +#+ */
|
|
/* Created: 2023/11/16 18:00:07 by maiboyer #+# #+# */
|
|
/* Updated: 2024/10/12 17:52:41 by rparodi ### ########.fr */
|
|
/* */
|
|
/* ************************************************************************** */
|
|
|
|
#include "me/char/char.h"
|
|
#include "me/printf/formatter/utils.h"
|
|
#include "me/types.h"
|
|
|
|
void set_var_for_pad_and_stuff(t_pad_and_stuff_args *a, t_printf_arg *d)
|
|
{
|
|
t_isize fill_zero;
|
|
t_isize fill;
|
|
|
|
fill_zero = 0;
|
|
fill = 0;
|
|
if (d->flags & ZERO_ALIGN && a->len < d->extra.align)
|
|
fill_zero = d->extra.align - a->len - a->fill_zero - 2 * d->extra.pretty
|
|
- a->sign_len;
|
|
if (d->flags & PRECISION && a->len < d->extra.precision)
|
|
fill_zero = d->extra.precision - a->len;
|
|
if (d->flags & (ALIGN) && a->len < d->extra.align)
|
|
fill = d->extra.align - a->len - a->fill_zero - 2 * d->extra.pretty
|
|
- a->sign_len - fill_zero;
|
|
if (fill_zero < 0)
|
|
fill_zero = 0;
|
|
if (fill < 0)
|
|
fill = 0;
|
|
if (fill_zero < 0)
|
|
fill_zero = 0;
|
|
if (fill < 0)
|
|
fill = 0;
|
|
a->fill_zero = fill_zero;
|
|
a->fill = fill;
|
|
}
|
|
|
|
void print_with_func(t_pad_and_stuff_args *a, t_printf_arg *d,
|
|
t_printf_func f, t_const_str t)
|
|
{
|
|
f(t, 1, d->p_args);
|
|
if (t[0] == ' ' && t[1] == 0 && a->fill)
|
|
a->fill--;
|
|
if (t[0] == '0' && t[1] == 0 && a->fill_zero)
|
|
a->fill_zero--;
|
|
}
|
|
|
|
void pad_and_stuff(t_pad_and_stuff_args a, t_printf_arg d, t_printf_func f)
|
|
{
|
|
set_var_for_pad_and_stuff(&a, &d);
|
|
if (!(d.extra.left_align || d.extra.precision) && d.flags & (ZERO_ALIGN))
|
|
{
|
|
print_sign_if_needed(a, d, f);
|
|
while (a.allow_zero_fill && a.fill_zero > 0)
|
|
print_with_func(&a, &d, f, "0");
|
|
}
|
|
else
|
|
{
|
|
while (!(d.extra.left_align) && d.flags & (ALIGN) && a.fill > 0)
|
|
print_with_func(&a, &d, f, " ");
|
|
print_sign_if_needed(a, d, f);
|
|
if (d.extra.pretty)
|
|
f(a.pretty, a.pretty_len, d.p_args);
|
|
}
|
|
while (a.allow_zero_fill && a.fill_zero > 0)
|
|
print_with_func(&a, &d, f, "0");
|
|
f(a.str, a.len, d.p_args);
|
|
while (d.extra.left_align && a.fill > 0)
|
|
print_with_func(&a, &d, f, " ");
|
|
}
|
|
|
|
void handle_prec_and_align(t_const_str fmt, t_usize *c_idx,
|
|
t_printf_arg *c_arg)
|
|
{
|
|
if (c_arg->extra.align && !(c_arg->flags & ZERO_ALIGN))
|
|
c_arg->flags |= ALIGN;
|
|
if (fmt[*c_idx] == '.')
|
|
{
|
|
(*c_idx)++;
|
|
c_arg->flags |= PRECISION;
|
|
}
|
|
}
|
|
|
|
void advance_atoi(t_const_str fmt, t_usize *idx)
|
|
{
|
|
while (me_isdigit(fmt[*idx]))
|
|
(*idx)++;
|
|
}
|